none
控件对象如何 传递? RRS feed

  • 问题

  • <UserControl x:Class="WpfRibbonApplication1.Controls.CIR"
                 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"
                   xmlns:MC="clr-namespace:WpfRibbonApplication1.Controls"
                 mc:Ignorable="d"
                 d:DesignHeight="300" d:DesignWidth="300">
        <Canvas x:Name="canvas1" >
            <Image x:Name="img1" Source="{Binding}"/>
            <Rectangle  Name="rectangle1" Stroke="Blue" StrokeThickness="1" Visibility="Hidden"/>
        </Canvas>
    </UserControl>

    然后我在窗口A中 加入了这个UserControl 和一个按钮。

    我想点击这个按钮,再弹出1个窗口B,B里面也同样有这个UserControl的引用。2个UserControl实际上是同一个对象

    请问如何实现这样的功能?2个界面操作同1个UserControl 对象,一旦修改UserControl 的内容,2个界面都会出现变化

    wpf,同一个元素,只能添加到1个容器里面,这么纠结,我在窗口B 也添加1个UserControl ,然后把A里UserControl 的值一一复制给B里的UserControl ,等于是复制了1个UserControl ,但这样太麻烦了,而且这样也就不是同一个UserControl 对象了。

    高人们,有办法可以解决的?最好有代码哈

    2011年5月10日 7:15

答案

  • 你好,

    使用同一个控件肯定是不行的,最直接的问题就是控件在界面上的布局相关的属性怎么办?比如说Parent, Width, Height等

    你可以把两个UserControl中你想同步的数据通过数据绑定进行同步。

    举个最简单的例子,

    <Window x:Class="Samples.Test3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Samples"
        Title="Test3" Height="500" Width="500">
      <StackPanel>
        <TextBox Text="{Binding SomeString, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding SomeString, UpdateSourceTrigger=PropertyChanged}"/>
      </StackPanel>
    </Window>
    

     

    namespace Samples
    {
      public partial class Test3 : Window, INotifyPropertyChanged
      {
        protected void OnNotifyPropertyChanged(string p)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged(this, new PropertyChangedEventArgs(p));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    
    
        string _SomeString = "SomeText";
        public string SomeString 
        {
          get { return _SomeString; }
          set
          {
            if (_SomeString != value)
            {
              _SomeString = value;
              OnNotifyPropertyChanged("SomeString");
            }
          }
        }
    
        public Test3()
        {
          InitializeComponent();
          DataContext = this;
        }
      }
    }
    

     

    根据具体情况的不同,具体实现的时候可以选择很多种不同的方式。我建议你先看一下这几篇文档,能对理解这个问题有很大的帮助。

    http://msdn.microsoft.com/zh-cn/library/ms752347.aspx

    http://msdn.microsoft.com/zh-cn/library/ms742521.aspx

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月12日 7:28
    版主

全部回复

  • 不知道你有没有了解过ViewModel   . 我觉得可以让两个UserControl使用同一个ViewModel ..
    just another day.
    2011年5月10日 11:02
  • 不太明白呀,有相关代码吗
    2011年5月11日 1:32
  • 有人说, 让2个ItemsControl绑定同一份数据,都用UserControl来显示,

    但我不知道代码怎么搞,

    2011年5月11日 3:07
  • 你好,

    使用同一个控件肯定是不行的,最直接的问题就是控件在界面上的布局相关的属性怎么办?比如说Parent, Width, Height等

    你可以把两个UserControl中你想同步的数据通过数据绑定进行同步。

    举个最简单的例子,

    <Window x:Class="Samples.Test3"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Samples"
        Title="Test3" Height="500" Width="500">
      <StackPanel>
        <TextBox Text="{Binding SomeString, UpdateSourceTrigger=PropertyChanged}"/>
        <TextBox Text="{Binding SomeString, UpdateSourceTrigger=PropertyChanged}"/>
      </StackPanel>
    </Window>
    

     

    namespace Samples
    {
      public partial class Test3 : Window, INotifyPropertyChanged
      {
        protected void OnNotifyPropertyChanged(string p)
        {
          if (PropertyChanged != null)
          {
            PropertyChanged(this, new PropertyChangedEventArgs(p));
          }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    
    
        string _SomeString = "SomeText";
        public string SomeString 
        {
          get { return _SomeString; }
          set
          {
            if (_SomeString != value)
            {
              _SomeString = value;
              OnNotifyPropertyChanged("SomeString");
            }
          }
        }
    
        public Test3()
        {
          InitializeComponent();
          DataContext = this;
        }
      }
    }
    

     

    根据具体情况的不同,具体实现的时候可以选择很多种不同的方式。我建议你先看一下这几篇文档,能对理解这个问题有很大的帮助。

    http://msdn.microsoft.com/zh-cn/library/ms752347.aspx

    http://msdn.microsoft.com/zh-cn/library/ms742521.aspx

     


    Min Zhu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月12日 7:28
    版主