【发布时间】:2015-05-11 09:17:03
【问题描述】:
我想在运行时动态创建 WPF 控件。在下面的代码中,我在 XAML 中添加了StackPanel,并在后面的代码中添加了Button/TextBlock/Triggers。我想在MouseEnter 操作的按钮下看到TextBlock,并想在MouseLeave 操作隐藏TextBlock。
这没有按预期工作。
如果在 XAML 中添加 Button/Textblock 代码(现在注释)而不是在后面的代码中创建它们(现在未注释),那么它工作正常。
请让我知道如何解决这个问题?如果我在运行时创建按钮而不是 XAML 代码,则无法理解为什么这不起作用。谢谢
XAML
<Grid>
<StackPanel Name="stackPanel5" >
<!--
<Button Name="Button1" Cursor="Hand" Content="Press Me"/>
<Border x:Name="TooltipBrd" BorderBrush="Black" BorderThickness="10,0,10,10" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="Collapsed">
<TextBlock Margin="0,10,0,0" x:Name="myTextBlock" Text="Coded Test" />
</Border>
-->
</StackPanel>
</Grid>
代码
public void LoadData()
{
//VisualState vs = new VisualState();
//vs.SetValue(FrameworkElement.NameProperty, YourStateName);
Button Button1 = new Button() { Cursor = Cursors.Hand, Content = "Press Me!" };
stackPanel5.Children.Add(Button1);
Border TooltipBrd = new Border()
{
BorderBrush = Brushes.Black,
BorderThickness = new Thickness(10, 10, 10, 10),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
Visibility = Visibility.Collapsed
};
TextBlock txtB1 = new TextBlock() { Text = "Lakshman", Margin = new Thickness(0, 100, 0, 0) };
TooltipBrd.Child = txtB1;
stackPanel5.Children.Add(TooltipBrd);
System.Windows.Interactivity.EventTrigger trigger1 = new System.Windows.Interactivity.EventTrigger();
trigger1.EventName = "MouseEnter";
ChangePropertyAction action1 = new ChangePropertyAction();
action1.TargetName = "TooltipBrd";
action1.PropertyName = "Visibility";
action1.Value = Visibility.Visible;
trigger1.Actions.Add(action1);
trigger1.Attach(Button1);
System.Windows.Interactivity.EventTrigger trigger2 = new System.Windows.Interactivity.EventTrigger();
trigger2.EventName = "MouseLeave";
ChangePropertyAction action2 = new ChangePropertyAction();
action2.TargetName = "TooltipBrd";
action2.PropertyName = "Visibility";
action2.Value = Visibility.Collapsed;
trigger2.Actions.Add(action2);
trigger2.Attach(Button1);
}
【问题讨论】:
-
无论你想做什么,删除所有这些并使用正确的 DataBinding。无需在 WPF 的程序代码中创建 UI 元素。使用 ItemsControl。