我在畫布上添加了一個Line
C#代碼以及一個上下文菜單和附加事件。我想利用上下文菜單的選擇,而不是在上下文菜單中的菜單文本旋轉Line
:菜單單擊事件對象參數引用菜單,而不是底層對象
newMenuItem1.PreviewMouseDown += new MouseButtonEventHandler((sx, ex) => {
MenuItem menuItem = (MenuItem)sx; string theHeader = menuItem.Header.ToString(); if (theHeader.Contains("90")) { Line ow = ex.Source as Line; rt = new RotateTransform(90, 25, 50); ow.RenderTransform = rt; } });
此代碼生成一個null reference exception
。如果我替換:
UIElement ow = ex.Source as UIElement;
實際的菜單文字會旋轉!
編輯: 這裏是更多的代碼,我現在想originalsource
太:
private void button1_Click(object sender, RoutedEventArgs e)
{
Line g = new Line();
g.Stroke = System.Windows.Media.Brushes.LawnGreen;
g.X1 = 0; g.X2 = 100;g.Y1 = 0;g.Y2 = 0;
g.HorizontalAlignment = HorizontalAlignment.Left;
g.VerticalAlignment = VerticalAlignment.Center;
g.StrokeThickness = 6;
ContextMenu k = new ContextMenu();
g.ContextMenu = k;
MenuItem newMenuItem1 = new MenuItem();
MenuItem newMenuItem2 = new MenuItem();
MenuItem newMenuItem3 = new MenuItem();
newMenuItem1.Header = "Rotate 90";
newMenuItem2.Header = "Rotate 180";
newMenuItem3.Header = "Rotate 270";
newMenuItem1.PreviewMouseDown += new MouseButtonEventHandler((sx, ex) => {
MenuItem menuItem = (MenuItem)sx;
string theHeader = menuItem.Header.ToString();
if (theHeader.Contains("90")) {
Line ow = (Line)ex.OriginalSource;
rt = new RotateTransform(90, 25, 50);
ow.RenderTransform = rt;
}
});
g.ContextMenu.Items.Add(newMenuItem1);
g.ContextMenu.Items.Add(newMenuItem2);
g.ContextMenu.Items.Add(newMenuItem3);
Canvas.SetTop(g, 18);
Canvas.SetLeft(g, 18);
MyCanvas.Children.Add(g);
///////
我也試過:
private static T FindAncestor<T>(DependencyObject current)
where T : DependencyObject
{
do
{
if (current is T)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
}
while (current != null);
return null;
}
,但它不工作。我的下一個計劃是從畫布上獲取座標,並嘗試確定哪些控件位於那裏。雖然如果一個對象被轉換,這將變得棘手,因爲我相信UI會在原始位置看到它。我也嘗試過其他控件,例如TextBox
,並獲得類似的問題。
ex.Source是您在此案例中的菜單項。你想要旋轉一個Line類型的對象。你應該更好地描述這個課程,以及你如何將菜單添加到它。 – asktomsk 2012-03-15 15:53:05
我加了一些更多的代碼,我也嘗試了原始資源。 – Len 2012-03-15 16:21:50
請注意,上下文菜單不是與您的行相同的樹的一部分,所以FindAncestor不起作用並不奇怪。 – 2012-03-15 18:35:12