我在故事板完成后会出现一个弹出控件。此弹出窗口附加到堆栈面板,它位于底部。
我已经实现了双击stackpanel的功能:当用户用鼠标左键双击它时,stackpanel会滑动并消失。
private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
对于弹出窗口,我设置了StaysOpen =" False"因此当用户在弹出窗口外的窗口上的任何位置单击时,弹出窗口将自动隐藏。当StaysOpen属性设置为false时,这是弹出窗口的默认行为。
我的问题是弹出行为(隐藏点击)与stackpanel的MouseLeftButtonDown事件冲突。
在MouseLeftButtonDown中,我检查e.ClickCount> = 2.如果是这样,我滑动堆栈面板并隐藏它。用户单击按钮时会显示堆栈面板:故事板开始显示,故事板完成后,还会显示堆栈面板的弹出窗口。
所以它发生在以下情况。
答案 0 :(得分:0)
我通过以下方式解决了这个问题。
在pnlTopMenu_MouseLeftButtonDown中,我执行以下操作:
private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
// I manually close Popup control, so both Popup and stackpanel will be closed on mouse left button down double click
this.MyPopup.IsOpen = false;
}
else if (e.ClickCount >= 2)
{
// Story board that starts and hide the stackpanel on double click.
Storyboard sb = Resources["sbHideTopMenu"] as Storyboard;
sb.Begin(pnlTopMenu);
}
}
因此,如果用户双击堆栈面板上的任何位置,则会隐藏弹出窗口和堆栈面板。如果用户只在stackpanel上的任何地方进行单击,则只会隐藏弹出窗口(当StaysOpen =" False"设置为弹出窗口时相同),并且stackpanel将保持可见(不隐藏)。
此外,为了保持弹出窗口位于窗口重新定位,移动或调整大小,我已应用下面的代码解释here。也就是说,在我的代码隐藏(xaml.cs)中,我在下面做了:
DependencyObject myPopupPlacementTarget = this.MyPopup.PlacementTarget;
Popup myPopup = this.MyPopup;
Window w = Window.GetWindow(myPopupPlacementTarget);
if (null != w)
{
w.LocationChanged += delegate (object sender, EventArgs args)
{
var offset = myPopup.HorizontalOffset;
myPopup.HorizontalOffset = offset + 1;
myPopup.HorizontalOffset = offset;
};
w.SizeChanged += delegate (object sender, SizeChangedEventArgs args)
{
var offset = myPopup.HorizontalOffset;
myPopup.HorizontalOffset = offset + 1;
myPopup.HorizontalOffset = offset;
};
}
其中MyPopup是xaml视图中的Popup控件。
唯一的问题是在调整大小时,当窗口最小化到一个小尺寸时,有时弹出窗口会在主窗口之外绘制。