如何从其他项目更改wpf用户内容

时间:2014-03-27 10:22:43

标签: c# wpf user-controls

如何从其他项目更改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);
        }

2 个答案:

答案 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类实例?为此,您可以通过构造函数或属性设置器注入它。