选择显示新图像时,保持子菜单打开

时间:2017-10-17 03:25:42

标签: wpf menu custom-controls menuitem

使用 WPF: A Simple Color Picker With Preview, Sacha Barber, 18 Apr 2012 , 我从中创建了一个自定义控件:

public class ColorCustomControl : Control 
{....}

然后用作:

<Menu....>
    <MenuItem.....>
       <pn:ColorCustomControl/>
    </MenuItem>
</Menu>

当选择Brushes MenuItem时,会生成以下图片:

enter image description here

选择打开的画笔子菜单中的任何项目将导致使用画笔子菜单REMAINING OPEN执行相应的操作。这就是我想要的效果。

但是,如下所示,选择三个样本中的任何一个都会导致新样本快速闪烁 - 它会替换&#34;预览&#34;左边的颜色模式 - 然后立即关闭刷子子菜单。

如果再次选择“画笔”菜单项,则会正确显示最近选择的样本。

我已经尝试了所有预览事件(即键盘丢失焦点,鼠标左键等),以便在选择样本时尝试停止子菜单的关闭。我找不到任何东西会阻止弹出窗口关闭。

从视觉中选择样本时,如何阻止画笔子菜单的关闭?

(我强烈怀疑,当选择新的样本图像时,重新绘制视觉效果,如InvalidateVisual(),会强制关闭子菜单。)

任何想法?

TIA

1 个答案:

答案 0 :(得分:1)

我的建议是停止来自用户控件的事件传播。所以在你的ColorCustomControl类中首先添加一个属性(如果需要,它也可以是一个依赖项):

private bool propagateEvents = true;

public bool PropagateEvents
{
    get
    {
        return propagateEvents;
    }
    set
    {
        propagateEvents = value;
    }
}

然后在每个鼠标事件处理程序的末尾添加e.Handled = !PropagateEvents;;最后添加Swatch_MouseLeftButtonUp方法(它必须处理由ImgSqaure1ImgSqaure2ImgCircle1引发的事件。 结果将是:

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>

我希望它可以帮到你。