您通常不会在 WPF 中执行此操作。
将应用程序逻辑基于 UI 元素的状态并不是一个好主意。
为什么?因为UI 不是数据,因此您应该将应用程序逻辑基于数据项的状态。
我建议你阅读这个和这个
尝试以与使用 winforms 相同的方式使用 WPF 是通向悲惨失败和痛苦的直接途径。
您必须接受 MVVM 并了解 DataBinding 以及 UI 如何必须始终与应用程序逻辑和数据分开。
编辑:添加代码示例(在 C# 中)
视图模型:
public class MainViewModel
{
public string ButtonContent {get;set;} //TODO: Add Property Change Notification
public MainViewModel()
{
ButtonContent = "SomeButtonContent";
}
}
看法:
<Button Width="200" Height="30" Margin="5,5,5,5">
<TextBlock FontSize="14" Text="{Binding ButtonContent}"/>
</Button>
代码背后:
public class MainWindow: Window
{
public MainWindow()
{
InitializeComponent();
SomeModule.Instance = new MainViewModel();
DataContext = SomeModule.Instance;
}
}
模块(C# 中的静态类):
public static class SomeModule
{
public static MainViewModel Instance {get;set;}
public void DoSomething()
{
if (Instance.ButtonContent == "SomeButtonContent")
//...etc
}
}
这就是我将 UI 与数据分开的意思。您将字符串放在 ViewModel 中,而不是 View 中,然后评估这些 ViewModel 属性的值以确定要做什么。
尽管如此,基于字符串值的应用程序逻辑似乎是一个弱解决方案。你真正需要做什么?有更好的方法,例如为此使用枚举。
编辑2:
拥有要绑定的 ViewModel 并不会使事情“复杂化”。它实际上简化了很多。
如何?因为您现在使用简单的控件来执行此操作,但随后您会希望对 a 内的 UI 元素执行相同的操作,ControlTemplate
甚至更糟糕的是 a DataTemplate
,这就是真正的问题出现的时候。
因此,在处理更复杂的 UI 场景之前,您必须习惯“WPF 方式”。
非最优方法:
public class MainWindow: Window
{
public string ButtonContent
{
get
{
return this.txtButtonContent.Text;
}
set
{
this.txtButtonContent.Text = value;
}
}
}
<Button Width="200" Height="30" Margin="5,5,5,5">
<TextBlock x:Name="txtButtonContent" FontSize="14" Text="Connect"/>
</Button>
您必须了解该类在 WPFButton
中没有属性。Text
与大多数古老的框架相比,WPF 有一个Content Model
字面上任何东西都可以包含任何东西,几乎没有限制。将Text
属性放入 Button 将引入 Button 仅包含 Text 的限制,而 WPF 中并非如此。
因此,您在这里真正想要做的是修改(恰好位于 Button 内部,但实际上可能位于 Visual Tree 中的任何位置)的Text
属性。TextBlock
这就是为什么我提到你实际上需要一个 ViewModel 来保存你的数据这一事实,因为没有(简单的)方法可以访问位于的 UI 元素,例如在 aDataTemplate
中以操作它们。您的 UI 必须始终反映应用程序数据的状态,这些数据存储在 Model 或 ViewModel 类中,而不是 UI。