Window
win
{get
set}
然后WPF窗体实例化这个类的时候就给这个类的win属性赋值就OK了!
如有疑问,可继续追问。将竭诚为您解答!
①绑定到某个控件的依赖属性DependencyProperty②绑定到定义了INotifyPropertyChanged的类(ObservableCollection就是实现了该接口) 先看DependencyProperty。可以把任何一个CLR对象绑定为DependencyProperty。在VS2010下输入propdp,按Tab,会生成一个模板public int MyProperty { get { return (int)GetValue(MyPropertyProperty)} set { SetValue(MyPropertyProperty, value)} } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new UIPropertyMetadata(0))MyProperty就是你要绑定的成员,修改它之后按Tab,后面的自动都会改变,如:public string Test { get { return (string)GetValue(TestProperty)} set { SetValue(TestProperty, value)} } // Using a DependencyProperty as the backing store for Test. This enables animation, styling, binding, etc... public static readonly DependencyProperty TestProperty = DependencyProperty.Register("Test", typeof(string), typeof(ownerclass), new UIPropertyMetadata(0))这里的ownerclass是拥有此成员的类名(如:class ownerclass {//...})。最后一个参数VS自动生成的有问题,因为它放入了一个参数0。实际上应该是UIPropertyMetadata(Object, PropertyChangedCallback, CoerceValueCallback, Boolean),用于设置UI中的数据更改后回调的函数。一般删除之或者用默认构造函数就行。如果需要它,一个简单的定义如下:public static readonly DependencyProperty IsNetworkChangedProperty = DependencyProperty.Register("IsNetworkChanged", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(false, new PropertyChangedCallback(MainWindow.OnIsNetworkChanged)))private static void OnIsNetworkChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { //MessageBox.Show(d.GetType().ToString())}注意这里是静态函数,由DependencyObject d来得到具体的通知对象。然后在控件中进行绑定,如<TextBlock Text="{Binding ElementName=MainWin, Path=Test}"/>,对Test变量的使用一如普通变量。 注意:①使用DependencyProperty比INotifyPropertyChanged的方法性能要高。因为它用Hash实现,不需要反射,而且是WPF系统中相当底层的一个基类②DependencyObjects are not marked as serializable③The DependencyObject class overrides and seals the Equals() and GetHashCode() methods④A DependencyObject has thread affinity –it can only be accessed on the thread on which it was created。(这一点很重要,特别是当程序中用到注册事件时,因为这些往往要开新线程。比如我的这个软件中,将bool型IsNetworkAvailabe用DependencyProperty绑定到控件,然后注册事件NetworkAvailabilityChanged,在NetworkAvailabilityChangedEventHandler中更新IsNetworkAvailabe值,这样就会抛出异常)在需要多线程 中 *** 作的绑定变量,则需要用INotifyPropertyChanged再看如何用INotifyPropertyChanged:这里要将待绑定的变量包装在一个类中:class MyTest : INotifyPropertyChanged { private string testpublic string Test { get { return this.test} set { if (this.test != value) { this.test = valuethis.NotifyPropertyChanged("Test")} } } public event PropertyChangedEventHandler PropertyChangedprivate void NotifyPropertyChanged(String info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info))} } } 其中test就是我们要绑定的变量。(绑定一个变量写这么多一堆,有点不值,我另开一篇,做一个snippet模板,用来快速生成)。绑定时不知为何上面的绑定方法不灵了,于是换成代码绑定吧:MyTest Testpublic MainWindow() { InitializeComponent()this.Test = new MyTest()Test.test = "thy"TestBox.DataContext = this.Test} 最终,在我的应用场景中,这两者都没能有用,我注册了事件NetworkAvailabilityChanged,在其中去修改一个绑定到ListBox的ObservableCollection,让其实现UI自动更新。但是总是会引起异常,我想可能是跨线程的原因吧。于是我试着用DependencyProperty绑定一个变量,在NetworkAvailabilityChanged事件中修改,还是不行,INotifyPropertyChanged也一样,BackgroundWorker也不行。最终没辙,在MainWindow中开了一个DispatcherTimer来轮询一个普通的bool变量:private DispatcherTimer _timer = new DispatcherTimer(DispatcherPriority.ContextIdle)_timer.Interval = TimeSpan.FromMilliseconds(100)_timer.Tick += new EventHandler(_timer_Tick)_timer.Start()虽说比较丑,但没法子啊,没这么多精力再去整了,先让它工作起来吧。现在我们已创建了一个自定义用户控件,并为其添加了一些绝妙的外观状态。现在,我们会将该自定义控件放入我们的主页中并添加一些按钮。然后,我们还将演示如何在 Embedded XAML Runtime 中链接这些按钮,并且让该项目在运行 CE 6.0 的嵌入式设备上运行。 1. 在 LayoutRoot 页面的顶部,您应该看到一个列有“Page.xaml”的选项卡。单击该选项卡打开主页文件。如果看不到该选项卡,可以单击右侧工具箱中的“项目”选项卡,然后通过浏览找到该文件 2. 让我们通过执行与上述自定义圆柱体控件类似的 *** 作来添加渐变,使主页变得更为引人注目 3. 只需在“对象和时间线”工具箱中选择“LayoutRoot”元素,然后单击在屏幕右侧的“属性”选项卡 4. 使用多种不同的渐变和颜色工具来实现您喜欢的背景颜色 5. 那么,现在让我们将自定义控件添加到该页面中 6. 我们需要先快速生成项目,以使自定义控件可以编译成一个资源。为此,转到“项目”->“生成解决方案”菜单项,或者只需单击键盘上的 F5 即可。生成过程将需要一点时间,可能会d出一个 Internet Explorer 窗口。不用理会它,关闭即可 7. 完成此过程后,我们便可以将自定义控件添加到该页面中 8. 在左侧工具面板中单击“资产”按钮 9. 进入“资源库”查看器后,单击“自定义控件”选项卡 10. 将“CylinderUserControl”项拖至您的 LayoutRoot 中 11. 我们需要为我们的元素命名 12. 单击圆柱体,然后在右侧“属性”面板的顶部键入“Cylinder”作为名称 13. 好了!我们仅需向我们的项目中添加三个按钮即可:“填充”按钮、“清空”按钮和“退出”按钮 14. 添加按钮非常简单 15. 在左侧工具栏中单击“按钮”按钮,然后转到您的 LayoutRoot 并拖动,即可在您的项目中创建任意大小的按钮。这样 *** 作三次 16. 现在,再次在左侧工具栏中单击“选择”箭头工具。选择第一个按钮,然后单击右侧面板中的“属性”选项卡(如果它未打开)。在“属性”面板的顶部是“名称”文本框字段。将这些按钮分别命名为“填充”、“清空”和“退出”。另外,您还需编辑每个按钮的“内容”字段,以便按钮显示正确的文本。“内容”字段也位于“属性”面板中 最后一次生成项目并将其保存起来。现在,您已创建了 Embedded XAML Runtime 项目需要的所有 XAML 文件! 现在我们已创建了一个自定义用户控件,并为其添加了一些绝妙的外观状态。现在,我们会将该自定义控件放入我们的主页中并添加一些按钮。然后,我们还将演示如何在 Embedded XAML Runtime 中链接这些按钮,并且让该项目在运行 CE 6.0 的嵌入式设备上运行。 1. 在 LayoutRoot 页面的顶部,您应该看到一个列有“Page.xaml”的选项卡。单击该选项卡打开主页文件。如果看不到该选项卡,可以单击右侧工具箱中的“项目”选项卡,然后通过浏览找到该文件 2. 让我们通过执行与上述自定义圆柱体控件类似的 *** 作来添加渐变,使主页变得更为引人注目 3. 只需在“对象和时间线”工具箱中选择“LayoutRoot”元素,然后单击在屏幕右侧的“属性”选项卡 4. 使用多种不同的渐变和颜色工具来实现您喜欢的背景颜色 5. 那么,现在让我们将自定义控件添加到该页面中 6. 我们需要先快速生成项目,以使自定义控件可以编译成一个资源。为此,转到“项目”->“生成解决方案”菜单项,或者只需单击键盘上的 F5 即可。生成过程将需要一点时间,可能会d出一个 Internet Explorer 窗口。不用理会它,关闭即可 7. 完成此过程后,我们便可以将自定义控件添加到该页面中 8. 在左侧工具面板中单击“资产”按钮 9. 进入“资源库”查看器后,单击“自定义控件”选项卡 10. 将“CylinderUserControl”项拖至您的 LayoutRoot 中 11. 我们需要为我们的元素命名 12. 单击圆柱体,然后在右侧“属性”面板的顶部键入“Cylinder”作为名称 13. 好了!我们仅需向我们的项目中添加三个按钮即可:“填充”按钮、“清空”按钮和“退出”按钮 14. 添加按钮非常简单 15. 在左侧工具栏中单击“按钮”按钮,然后转到您的 LayoutRoot 并拖动,即可在您的项目中创建任意大小的按钮。这样 *** 作三次 16. 现在,再次在左侧工具栏中单击“选择”箭头工具。选择第一个按钮,然后单击右侧面板中的“属性”选项卡(如果它未打开)。在“属性”面板的顶部是“名称”文本框字段。将这些按钮分别命名为“填充”、“清空”和“退出”。另外,您还需编辑每个按钮的“内容”字段,以便按钮显示正确的文本。“内容”字段也位于“属性”面板中 最后一次生成项目并将其保存起来。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)