如何在不向代码隐藏文件添加代码的情况下执行拖放操作? 我可以使用附加属性吗? 如果是这样,那怎么样?
首先想到的是,我认为我可以创建一个附加属性并将其绑定到与拖动相关联的任何拖动项的属性。当该属性的状态发生变化时,我附加的属性的valueChanged方法处理程序将执行当前位于我的代码隐藏文件中的拖动逻辑。
但是,我还没有确定拖拽状态的这种属性。
注意: 我没有使用Prism因为我正在实现Windows Phone 8.1应用程序。 因此,此时Prism不受支持。
答案 0 :(得分:0)
以下答案涉及管理UIElement事件的整体模式,没有代码隐藏。
<强>要点:强> 我们可以访问使用附加属性的控件,并且在附加属性的元数据对象中,当附加属性的值发生更改时,我们可以调用事件处理程序。 附加属性的值在我们的XAML文件中设置为“true”。这将立即触发附加属性的元数据对象以更新状态并调用方法处理程序以更改值。
此示例演示了两个控件,它们将在鼠标输入事件期间更改颜色:
XAML代码:
<Window x:Class="Temp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:behaviors="clr-namespace:Temp.Behaviors"
Title="MainWindow" Height="350" Width="525">
<Canvas>
<Ellipse Width="50" Height="50" Fill="Gray" Canvas.Top="0"
behaviors:AttachedProperties.ActivateOnMouseEnter="True" />
<Ellipse Width="50" Height="50" Fill="Gray" Canvas.Left="200"
behaviors:AttachedProperties.ActivateOnMouseEnter="True" />
</Canvas>
</Window>
附加财产代码:
using System.Windows;
using System.Windows.Media;
using System.Windows.Shapes;
namespace Temp.Behaviors
{
public class AttachedProperties : DependencyObject
{
public static readonly DependencyProperty ActivateOnMouseEnterProperty =
DependencyProperty.RegisterAttached("ActivateOnMouseEnter", typeof(bool), typeof(AttachedProperties), new PropertyMetadata(false, ActivateOnMouseEnter_ValueChanged));
private static void ActivateOnMouseEnter_ValueChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
Ellipse element = dependencyObject as Ellipse;
element.MouseEnter += (se, ev) =>
{
element.Fill = new SolidColorBrush(Colors.Orange);
};
}
public static void SetActivateOnMouseEnter(UIElement element, bool value)
{
element.SetValue(ActivateOnMouseEnterProperty, value);
}
}
}
注意: 在这段代码中,我们反复订阅鼠标输入事件而没有取消订阅(这很糟糕)。但是,为简单起见,我保留了管理订阅的逻辑。