如何从其他项目更改wpf用户内容。例如,我有两个用户控制项目。我希望在第二个wpf用户项目中的时钟滴答时更改第一个用户控件项目中的文本框。有可能吗?
第一个项目
<UserControl x:Class="StatusBar.StatusBarWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="800">
<Grid>
<StatusBar VerticalAlignment="Bottom" Grid.Column="0" Background="{x:Null}">
<StatusBarItem HorizontalAlignment="Right">
<TextBox x:Name="TxtClock" IsReadOnly="True" Background="{x:Null}" BorderThickness="0" Foreground="Black" x:FieldModifier="public" Text="i want change" />
</StatusBarItem>
</StatusBar>
</Grid>
第二个项目
DispatcherTimer clock = new DispatcherTimer();
TxtSaat.Text = string.Format("{0:HH:mm:ss}", DateTime.Now);
clock.Tick += new EventHandler(Clock_Tick);
clock.Interval = new TimeSpan(0, 0, 1);
clock.Start();
private void Clock_Tick(object sender, EventArgs e)
{
TxtClock.Text = string.Format("{0:HH:mm:ss}", DateTime.Now);
}
答案 0 :(得分:0)
首先,您需要以某种方式获取用户控件的实例。鉴于此,您可以使用:
userControlInstance.TxtClock.Text = String.Format("{0:HH:mm:ss}", DateTime.Now);
或者你可以给用户控制一个属性:
private DateTime _displayTime;
public DateTime DisplayTime
{
get { return _displayTime; }
set {
_displayTime = value;
TxtClock.Text = String.Format("{0:HH:mm:ss}", _displayTime);
}
}
来自外界的电话
userControlInstance.DisplayTime = DateTime.Now;
重要的部分是:您需要有权访问用户控件的实例。
答案 1 :(得分:0)
您遇到的问题部分是由UserControl中的程序逻辑引起的。这往往会让事情变得更棘手。理想情况下,只有特定于视图的内容应该在UserControl中,理想情况下,这意味着只有xaml,后面没有代码。
我建议创建一个可以保留所有逻辑的非视图类。例如:
class ClockViewModel : INotifyPropertyChanged
{
public ClockViewModel()
{
...
clock.Tick += new EventHandler(Clock_Tick);
}
private void Clock_Tick(object sender, EventArgs e)
{
Tick = string.Format("{0:HH:mm:ss}", DateTime.Now);
}
string _tick="";
public string Tick
{
get
{
return _tick;
}
set
{
_tick = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Tick"));
}
}
}
然后您的视图可以绑定到该类的同一实例(只需将相同的实例注入其构造函数或属性)。然后在你的xaml中你可以这样做:
<TextBox Text="{Binding Tick}"/>
您的文本框将在每个刻度线上自动更新。这样,您的逻辑通常不需要了解TextBox或视图。那么问题就变成了如何在不同项目中的代码之间共享相同的ClockViewModel类实例?为此,您可以通过构造函数或属性设置器注入它。