2014-03-27 38 views
0

如何从其他项目更改wpf用户内容。例如,我有两个用户控制项目。当第二个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

首先,你需要获得用户控件的实例莫名其妙。鉴于这种情况,您可以使用此:

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; 

重要的部分是:您需要访问用户控件的实例。

+0

我做到了。但用户控制不更新。 –

+0

让我猜。你在窗口中有一个用户控件,并且你使用'... = new MyUserControl();'创建了一个实例,你运行更新并且现在显示没有更新? –

+0

是的。你是对的。 –

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

相关问题