使用 WPF: A Simple Color Picker With Preview, Sacha Barber, 18 Apr 2012 , 我从中创建了一个自定义控件:
public class ColorCustomControl : Control
{....}
然后用作:
<Menu....>
<MenuItem.....>
<pn:ColorCustomControl/>
</MenuItem>
</Menu>
当选择Brushes MenuItem时,会生成以下图片:
选择打开的画笔子菜单中的任何项目将导致使用画笔子菜单REMAINING OPEN执行相应的操作。这就是我想要的效果。
但是,如下所示,选择三个样本中的任何一个都会导致新样本快速闪烁 - 它会替换&#34;预览&#34;左边的颜色模式 - 然后立即关闭刷子子菜单。
如果再次选择“画笔”菜单项,则会正确显示最近选择的样本。
我已经尝试了所有预览事件(即键盘丢失焦点,鼠标左键等),以便在选择样本时尝试停止子菜单的关闭。我找不到任何东西会阻止弹出窗口关闭。
从视觉中选择样本时,如何阻止画笔子菜单的关闭?
(我强烈怀疑,当选择新的样本图像时,重新绘制视觉效果,如InvalidateVisual(),会强制关闭子菜单。)
任何想法?
TIA
答案 0 :(得分:1)
我的建议是停止来自用户控件的事件传播。所以在你的ColorCustomControl
类中首先添加一个属性(如果需要,它也可以是一个依赖项):
private bool propagateEvents = true;
public bool PropagateEvents
{
get
{
return propagateEvents;
}
set
{
propagateEvents = value;
}
}
然后在每个鼠标事件处理程序的末尾添加e.Handled = !PropagateEvents;
;最后添加Swatch_MouseLeftButtonUp
方法(它必须处理由ImgSqaure1
,ImgSqaure2
和ImgCircle1
引发的事件。
结果将是:
private void Swatch_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Image img = (sender as Image);
ColorImage.Source = img.Source;
e.Handled = !PropagateEvents;
}
private void Swatch_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = !PropagateEvents;
}
private void CanvImage_MouseDown(object sender, MouseButtonEventArgs e)
{
IsMouseDown = true;
e.Handled = !PropagateEvents;
}
private void CanvImage_MouseUp(object sender, MouseButtonEventArgs e)
{
IsMouseDown = false;
e.Handled = !PropagateEvents;
}
并在用户控件XAML中:
<Image x:Name="ImgSqaure1"
Height="20" Width="20"
Source="Images/ColorSwatchSquare1.png"
Margin="45,0,0,0"
ToolTip="Square swatch1"
MouseLeftButtonDown="Swatch_MouseLeftButtonDown"
MouseLeftButtonUp="Swatch_MouseLeftButtonUp"/>
<Image x:Name="ImgSqaure2"
Height="20" Width="20"
Source="Images/ColorSwatchSquare2.png" Margin="5,0,0,0"
ToolTip="Square swatch2"
MouseLeftButtonDown="Swatch_MouseLeftButtonDown"
MouseLeftButtonUp="Swatch_MouseLeftButtonUp"/>
<Image x:Name="ImgCircle1" Height="20" Width="20"
Source="Images/ColorSwatchCircle.png" Margin="5,0,0,0"
ToolTip="Circle swatch1"
MouseLeftButtonDown="Swatch_MouseLeftButtonDown"
MouseLeftButtonUp="Swatch_MouseLeftButtonUp" />
现在,您只需在菜单中设置PropagateEvents
属性:
<Menu....>
<MenuItem.....>
<pn:ColorCustomControl PropagateEvents="False" />
</MenuItem>
</Menu>
我希望它可以帮到你。