请问WPF在Blend 4中怎么实现对无边框的窗体拖动。。。会请详细说下。会额外多加50分。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问WPF在Blend 4中怎么实现对无边框的窗体拖动。。。会请详细说下。会额外多加50分。。相关的知识,希望对你有一定的参考价值。

单单一个图片之类的我已经可以实现拖动了。。。我制作了一个界面实现了3D旋转(双击下旋转到另一个界面去),但现在就是有一个问题,它居然实现不了窗体界面拖动了,我也用了这个代码MouseDown(object sender, MouseButtonEventArgs e)
if (e.LeftButton == MouseButtonState.Pressed),是不是因为弄了一个3D旋转界面,所以不能拖动了?请帮我找到解决的关键。。。

我试了下 因为 使用了3DVIEWPORT 做3D 的视觉效果,3DVIEWPORT 貌似 是不支持拖拽的
但是GRID 是支持拖拽的,你可以把 3D VIEWPORT 套在GRID 里 对GRID 做拖拽操作,另外 我测试使用的是BLEND4,BLEND3和4里都自带了MouseDragElementBehavior的 行为,直接在资产--行为里找到,拖拽到控件上就OK了
参考技术A 你单步运行一下试试,可能你的程序根本就运行不到MouseDown事件中了,在WPF里有好多事件不能直接同时用,有的事件就会把别的事件给拦截了。 参考技术B 尝试实现以下窗体的PreviewMouseDown事件追问

这个怎么用呢?能不能详细说下额。。。

参考技术C 在窗体的 mouseleftbuttondown 事件 写
this.DragMove();

非共享 WPF 行为

【中文标题】非共享 WPF 行为【英文标题】:Nonshared WPF behavior 【发布时间】:2016-09-13 12:23:17 【问题描述】:

我在 Window 上有两个 DataGrid,我正在使用 Blend 行为在列标题中创建过滤器。

<DataGrid>
  <i:Interaction.Behaviors>
    <v:ColumnBehavior/>
  </i:Interaction.Behaviors>
</DataGrid>
<DataGrid>
  <i:Interaction.Behaviors>
    <v:ColumnBehavior/>
  </i:Interaction.Behaviors>
</DataGrid>  

问题是,这种行为的实例在某种程度上对两个 DataGrid 来说都是常见的,所以如果你在第一个 DataGrid 上设置过滤器,它会在第二个 DataGrid 中自动设置,反之亦然。我需要让这些过滤器(行为)独立。从我读到的内容,样式是不可能实现的。

行为类:

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
Imports System.IO
Imports System.Text
Imports System.Windows.Controls.Primitives
Imports System.Windows.Interactivity
Imports System.Windows.Markup
Namespace View
  Friend Class ColumnBehavior
    Inherits Behavior(Of DataGrid)
    Protected Overrides Sub OnAttached()
      MyBase.OnAttached()
      AddHandler AssociatedObject.AutoGeneratingColumn, AddressOf OnAutoGeneratingColumn
    End Sub
    Protected Sub OnAutoGeneratingColumn(sender As Object, e As DataGridAutoGeneratingColumnEventArgs)
      If e.PropertyDescriptor IsNot Nothing Then
        Dim descriptor = DirectCast(e.PropertyDescriptor, PropertyDescriptor)
        Dim customString = DirectCast(descriptor.Attributes(GetType(CustomStringAttribute)), CustomStringAttribute)
        If customString IsNot Nothing Then
          Dim unitType = DirectCast([Enum].Parse(GetType(DataGridLengthUnitType), customString.Value), DataGridLengthUnitType)
          e.Column.Width = New DataGridLength(1, unitType)
        End If
        Dim display = DirectCast(descriptor.Attributes(GetType(DisplayAttribute)), DisplayAttribute)
        If display IsNot Nothing Then
          e.Cancel = (Not display.GetAutoGenerateField().GetValueOrDefault(True))
          e.Column.Header = display.GetShortName()
          Dim headerStyle = e.Column.HeaderStyle
          If headerStyle Is Nothing Then headerStyle = New Style(GetType(DataGridColumnHeader))
          headerStyle.Setters.Add(New Setter(ToolTipService.ToolTipProperty, display.GetDescription()))
          e.Column.HeaderStyle = headerStyle
          If display.GetAutoGenerateFilter().GetValueOrDefault(False) Then
            Dim comboBoxBinding = DirectCast(descriptor.Attributes(GetType(ComboBoxBindingAttribute)), ComboBoxBindingAttribute)
            If comboBoxBinding IsNot Nothing Then
              Dim bindingString = "Binding 0, RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type Window"
              Dim dataTemplateXaml = <DataTemplate>
                                       <Grid>
                                         <Grid.ColumnDefinitions>
                                           <ColumnDefinition Width="*"/>
                                           <ColumnDefinition Width="Auto"/>
                                         </Grid.ColumnDefinitions>
                                         <TextBlock
                                           Text="Binding Content, RelativeSource=RelativeSource Mode=TemplatedParent"
                                           Margin="0,0,4,0"
                                           VerticalAlignment="Center"
                                           Grid.Column="0"/>
                                         <ComboBox
                                           IsReadOnly="True"
                                           ItemsSource=<%= String.Format(bindingString, comboBoxBinding.ItemsSource) %>
                                           SelectedItem=<%= String.Format(bindingString, comboBoxBinding.SelectedItem) %>
                                           Grid.Column="1"
                                           SelectedIndex="0"/>
                                       </Grid>
                                     </DataTemplate>
              Dim headerTemplate As DataTemplate
              Using dataTemplateReader As New MemoryStream(Encoding.UTF8.GetBytes(dataTemplateXaml.ToString()))
                Dim context As New ParserContext
                context.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation")
                context.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml")
                headerTemplate = DirectCast(XamlReader.Load(dataTemplateReader, context), DataTemplate)
              End Using
              e.Column.HeaderTemplate = headerTemplate
            End If
          End If
        End If
        Dim displayFormat = DirectCast(descriptor.Attributes(GetType(DisplayFormatAttribute)), DisplayFormatAttribute)
        If displayFormat IsNot Nothing Then
          DirectCast(e.Column, DataGridBoundColumn).Binding.StringFormat = displayFormat.DataFormatString
        End If
      End If
    End Sub
    Protected Overrides Sub OnDetaching()
      MyBase.OnDetaching()
      RemoveHandler AssociatedObject.AutoGeneratingColumn, AddressOf OnAutoGeneratingColumn
    End Sub
  End Class
End Namespace  

您使用模型中的属性在 DataGrid 中自动创建过滤器:

<Display(ShortName:="Meeting", Description:="Meeting code", AutoGenerateField:=True, AutoGenerateFilter:=True)>
    <ComboBoxBinding("DataContext.MeetingCodes", "DataContext.TasksMeetingCodeFilter")>
    <CustomString("SizeToCells")>
    Public Property TaskMeetingCode As String Implements ITaskView.TaskMeetingCode

【问题讨论】:

你能发布行为代码吗?您可能在此行为中使用了一些静态值。 我添加了行为代码。我认为没有什么是静态的。 【参考方案1】:

问题解决了。行为类有两个实例,应该是这样,但两个实例都绑定到 viewmodel 中的相同属性...

【讨论】:

以上是关于请问WPF在Blend 4中怎么实现对无边框的窗体拖动。。。会请详细说下。会额外多加50分。。的主要内容,如果未能解决你的问题,请参考以下文章

blend 无法打开wpf

Blend 设置通明窗体

WPF中鼠标事件MouseLeftButtonDown,MouseLeftButtonUp实现无边框窗体的最大化,还原

vs2010和blend 4都装好了,我怎么将Blend 4画的东西移植到我的VS2010 WPF应用程序中呢,请高手指点,谢谢

wpf 自定义 无边框 窗体 resize 实现

WPF 透明窗体,无边框(比如一些桌面的日历桌面程序),如何让程序钉在桌面上。直接镶嵌在桌面背景上?