您通常不会在 WPF 中执行此操作。
将应用程序逻辑基于 UI 元素的状态并不是一个好主意。
为什么?因为UI is Not Data,因此您应该将应用程序逻辑基于数据项的状态。
我建议你阅读this和this
尝试以与使用 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 属性的值以确定要做什么。
不过,将应用程序逻辑基于字符串的值似乎是一个弱解决方案。你真正需要做什么?有更好的方法,例如为此使用 Enum。
编辑2:
拥有要绑定的 ViewModel 不会使事情“复杂化”。它实际上简化了很多。
怎么样?因为您现在使用简单的控件来执行此操作,但随后您会希望对 ControlTemplate 或更糟的 DataTemplate 中的 UI 元素执行相同的操作,这才是真正的问题出现的时候。
因此,在处理更复杂的 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>
您必须了解 Button 类在 WPF 中没有 Text 属性。与大多数古老的框架相比,WPF 有一个 Content Model,其中 anything 可以包含任何东西,几乎没有限制。将Text 属性添加到 Button 将引入 Button 仅包含文本的限制,而 WPF 中并非如此。
因此,您在此处实际要做的是修改TextBlock 的Text 属性(它恰好位于按钮内部,但实际上可能位于可视树中的任何位置)。
这就是为什么我提到您实际上需要一个 ViewModel 来保存您的数据这一事实,因为没有(简单的)方法可以访问位于例如 DataTemplate 中的 UI 元素以操作它们。您的 UI 必须始终反映应用程序数据的状态,这些数据存储在 Model 或 ViewModel 类中,而不是 UI。