在ResourceDictionary中为ControlTemplate定义WPF事件。

14 浏览
0 Comments

在ResourceDictionary中为ControlTemplate定义WPF事件。

我目前正在尝试实现一个Metro风格的窗口。

所以我在ResourceDictionary中创建了以下样式:

我的问题是我不知道如何实现拖动功能。

我的dragRectangle没有Command属性,那么我如何在MVVM中的MouseLeftButtonDown事件上调用DragMove()函数呢?

谢谢

0
0 Comments

WPF中的ResourceDictionary for a ControlTemplate的事件问题及解决方法

在WPF中,我们可以使用ResourceDictionary来定义控件的样式(ControlTemplate)。然而,有时我们可能需要为这些样式添加事件处理程序。下面是一个关于在ResourceDictionary中为ControlTemplate添加事件处理程序的问题以及解决方法。

问题的出现原因:

在ResourceDictionary中添加事件处理程序的原因是我们希望在鼠标左键按下时拖动窗口。但是,在ResourceDictionary中无法直接为控件添加事件处理程序。因此,我们需要通过一些步骤来实现这一功能。

解决方法:

1. 首先,我们需要在ResourceDictionary所在的文件夹中添加一个与ResourceDictionary同名但后缀为".xaml.cs"的文件。例如,如果ResourceDictionary的名称为"MetroStyleResourceDictionary.xaml",则需要添加一个名为"MetroStyleResourceDictionary.xaml.cs"的文件。

2. 接下来,在代码后台文件中添加如下代码:

public partial class MetroStyleResourceDictionary
{
    //...
}

3. 然后,我们需要在Xaml文件中添加"x:Class"属性,指定代码后台文件的类名。示例如下:


    

4. 现在,我们可以为dragRectangle添加"MouseLeftButtonDown"事件处理程序,并且需要获取到窗口的引用。可以通过将窗口绑定到dragRectangle的"Tag"属性来实现。示例如下:


5. 最后,在代码后台文件中添加事件处理程序。示例如下:

public partial class MetroStyleResourceDictionary
{
    void dragRectangle_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        Rectangle dragRectangle = sender as Rectangle;
        Window window = dragRectangle.Tag as Window;
        if (window != null)
        {
            window.DragMove();
        }
    }
}

通过以上步骤,我们就可以在ResourceDictionary中为ControlTemplate添加事件处理程序了。感谢提问者详细解答了这个问题,因为我之前看过一些在stackoverflow上的答案,这些答案对提问者进行了指责,但并没有完全回答问题。

0