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

Keep submenu open when a new image is selected for display

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

public class ColorCustomControl : Control 
{....}

然后用作:

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

选择刷子benuitem时,这会产生以下图片:

在打开的画笔子菜单中选择任何项目都会导致对画笔子菜单保持打开状态采取适当的操作。这就是我想要的效果。

但是,如下所示,选择三个样本中的任何一个都会导致新样本快速闪烁——它会替换 "Preview" 左侧的颜色模式——随后立即关闭画笔子菜单。

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

我已经尝试了所有预览事件(即键盘失去焦点、鼠标左键按下等),以尝试在选择样本时停止关闭子菜单。我发现没有任何东西可以阻止弹出窗口关闭。

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

(我强烈怀疑在 InvalidateVisual() 选择新样本图像时重新绘制视觉对象会强制关闭子菜单)。

有什么想法吗?

TIA

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

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>

希望对您有所帮助