请问WPF在Blend 4中怎么实现对无边框的窗体拖动。。。会请详细说下。会额外多加50分。。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问WPF在Blend 4中怎么实现对无边框的窗体拖动。。。会请详细说下。会额外多加50分。。相关的知识,希望对你有一定的参考价值。
单单一个图片之类的我已经可以实现拖动了。。。我制作了一个界面实现了3D旋转(双击下旋转到另一个界面去),但现在就是有一个问题,它居然实现不了窗体界面拖动了,我也用了这个代码MouseDown(object sender, MouseButtonEventArgs e)
if (e.LeftButton == MouseButtonState.Pressed),是不是因为弄了一个3D旋转界面,所以不能拖动了?请帮我找到解决的关键。。。
但是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分。。的主要内容,如果未能解决你的问题,请参考以下文章
WPF中鼠标事件MouseLeftButtonDown,MouseLeftButtonUp实现无边框窗体的最大化,还原
vs2010和blend 4都装好了,我怎么将Blend 4画的东西移植到我的VS2010 WPF应用程序中呢,请高手指点,谢谢