我有一個ItemsControl使用一個Canvas作爲ItemsPanel。 itemsTemplate託管一個自定義控件。點擊控件時,我希望它「移動到前面」。我知道我可以在我的控制與zIndex的做到這一點,像這樣:Wpf帶到前面
private void MyControl_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if(((FrameworkElement)sender).TemplatedParent==null) return;
ContentPresenter presenter = (ContentPresenter)((FrameworkElement) sender).TemplatedParent;
int currentValue = Panel.GetZIndex(presenter);
Console.WriteLine(currentValue);
Panel.SetZIndex(presenter, 99);
}
這個工作並設置zIndex的就好了。但是當我在ItemsControl中點擊不同的控件時,它將得到完全相同的ZIndex,因此它不會「移到其他控件的前面」。
基本上我只是想與Windows展覽一樣的行爲。
我試着在PreviewMouseUp事件中設置ZIndex回到0,並且確保點擊的控件總是在頂部,但是因爲所有其他控件具有相同的ZIndex爲0,那麼將假設基於默認的順序在列表中的位置。
一個例子:
可以說我有3個控制所有爲0的zIndex的
如果我點擊控制3,然後2然後1(所以他們使用默認的列表中的位置)。我期望它在ZOrder的頂部有3個,然後是2然後是1.但是因爲我在MouseUp上將ZIndex設置爲零,所以它的默認順序是1,2,3。
有沒有一種簡單的方法來處理這個問題,還是我需要跟蹤訂單並遞增遞減一個任意值,例如99我自己?
那麼爲了溢出'ZIndex',你需要'int.MaxValue'點擊,即使有人以每秒10次,每天24次的令人難以置信的速度點擊,這仍需要將近7年的連續時間,不間斷的超級點擊!所以我不認爲有什麼可擔心的。另外,靜態成員'ZIndex'的初始值不應該爲'0',因爲第一次點擊會分配'1',這可能低於另一個控件的'ZIndex'。最好用'1000'來初始化它,以確保這種方法從第一次點擊開始就起作用。 – 2012-12-25 15:23:09
輝煌。這也適用於我(略有不同)的情況。我刪除了每個函數開頭的if()檢查,並將演示者更改爲聲明爲:ContentControl presenter =(ContentControl)((FrameworkElement)sender);'。感謝您的解決方案! – Zyre 2015-11-29 16:58:21