上篇文章里面说到UserControl主要是现有控件的组合。组合是好组合啊,我随便拖几个控件往页面里面一放,比如我弄个TextBox和一个button往页面里面一方,起个名字就是UserControl了,问题是这个UserControl光能看不能用啊。比如说我在WPF窗体里面要对这个UserControl里面的TextBox赋值或者获取它的值,咋获取?我想点击UserControl里的Button来触发这个UserControl所在的WPF窗体后台代码文件里面(暂不提MVVM模式)的某个事件,怎么触发?这两个问题才是创建UserControl的关键问题。
第一个问题:获取或设置属性。
建立一个wpf用户控件项目,在UserControl1.xaml里添加一个Button和TextBox。用户控件默认继承自UserControl类,你也可以修改他的所继承的类。若修改为其他类,UserControl则将拥有这个类的相应的方法和属性。这里先不修改,保持其默认的继承。
现在的主要任务是当这个用户控件放到WPF窗体里面后,在窗体里能获取或设置里面的 TextBox的值。
关键的一步是为这个用户控件添加一个依赖属性。
比如我要给这个用户控件添加一个Text属性,即当我将这个用户控件放到WPF窗口里要获取或者设置它的Text属性。
添加这个Text依赖属性的代码如下:
这样就为这个用户控件
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string),
typeof(UserControl1),
new PropertyMetadata("TextBox", new PropertyChangedCallback(OnTextChanged)));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs args)
{
UserControl1 source = (UserControl1)sender;
source.tb.Text = (string)args.NewValue;
}
增加了一个名字为Text的属性。若你刚好正在做这方面或者学习这方面的东西,你通过搜索看到了这篇文章估计有人会直接把上面的代码复制一下看实现了,心里很高兴。这样是很快,但是这是哪走了鱼而不是渔。这里面主要的句代码是
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string),
typeof(UserControl1),
new PropertyMetadata("TextBox", new PropertyChangedCallback(OnTextChanged)));
然后主要是DependencyProperty.Register方法。
第一个参数,是你要为这个用户控件增加的属性的名字,即你在第一个参数里面填写什么字符串将来你的用户控件将会增加以这个字符串为名字的属性。
第二个参数是指这个属性对应的数据类型。
第三个参数这个属性所有者的类型。
第四个参数属性改变时触发的回调事件。
这个方法及其参数弄懂后,就很容易来为用户控件增加属性了。
下面第二个大问题,事件传阅。
比如我们想让这个用户控件暴露给窗体一个MyButtonClick事件。代码如下:
public static readonly RoutedEvent MyButtonClickEvent =
EventManager.RegisterRoutedEvent("MyButtonClick", RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<object>), typeof(UserControl1));
public event RoutedPropertyChangedEventHandler<object> MyButtonClick
{
add
{
this.AddHandler(MyButtonClickEvent, value);
}
remove
{
this.RemoveHandler(MyButtonClickEvent, value);
}
}
public void OnMyButtonClick(object oldValue, object newValue)
{
RoutedPropertyChangedEventArgs<object> arg =
new RoutedPropertyChangedEventArgs<object>(oldValue, newValue, MyButtonClickEvent);
this.RaiseEvent(arg);
}
这样通过这两段代码你的用户控件就得到了一个Text属性和一个MyButtonClick方法。
请注意以上两段代码中,特别是第二段注册事件的代码中要特别注意,当你的用户控件继承的基类不同时,注册事件时可能所用的参数和事件的类型会有所不同,比如msdn上有个例子是继承自Button的,其中的事件类型和参数就不同:
public class MyButtonSimple: Button
{
// Create a custom routed event by first registering a RoutedEventID
// This event uses the bubbling routing strategy
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
"Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));
// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
add { AddHandler(TapEvent, value); }
remove { RemoveHandler(TapEvent, value); }
}
// This method raises the Tap event
void RaiseTapEvent()
{
RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent);
RaiseEvent(newEventArgs);
}
// For demonstration purposes we raise the event when the MyButtonSimple is clicked
protected override void OnClick()
{
RaiseTapEvent();
}
}
可以建一个项目将这个类库引用进来,试一试
分享到:
相关推荐
UserControl是WPF中创建自定义控件的一种基础类型,它允许开发者将多个内置控件组合成一个复合控件,以满足特定的需求。本教程将深入讲解如何制作和使用UserControl,特别适合那些对WPF自定义控件不熟悉的初学者。 ...
在制作电池控件时,我们首先会定义一个`UserControl`,这是WPF中自定义控件的基础。在XAML文件中,我们可以使用各种WPF元素来构建电池的外观,例如`Rectangle`表示电池主体,`Path`来绘制电池的边角和充电指示线,...
2. 在UserControl的后台代码中,使用Process类加载Unity的.exe文件,并获取其进程对象。 3. 使用Process的StartInfo属性设置启动参数,如工作目录、命令行参数等。 4. 启动Unity进程,并通过Process的...
在这个文件中,你可能会看到`Grid`、`DataGrid`或自定义的`UserControl`等元素,这些元素将被用作表格的基础结构。`DataGrid`是WPF内置的表格控件,它可以自动处理数据绑定和显示,但在这里,我们可能需要自定义它以...
在本文中,我们将深入探讨如何在Windows Presentation Foundation (WPF) 中实现边侧滑出效果,这在构建现代用户界面时特别有用,特别是在设计类似导航菜单的组件时。VS2010是Microsoft Visual Studio 2010的简称,它...
最后,为了提高报表的复用性和模块化,可以利用WPF的UserControl或CustomControl来封装特定的报表组件。这样,可以在多个地方重用已有的报表元素,降低代码的复杂性和维护成本。 在实际项目中,往往还需要结合MVVM...
总的来说,制作WPF中的BusyIndicator需要对WPF动画系统有深入的理解,以及如何在C#代码中控制动画的启动和停止。通过实践,你可以创建出既实用又美观的BusyIndicator,提升你的应用程序的用户体验。学习和掌握这一...
1. **添加资源**:在XAML文件的`<Window>`或`<UserControl>`的`Resources`部分定义加载图标。这可以是一个`ImageSource`,也可以是一个自定义的`Storyboard`动画,比如旋转的`Path`元素。 ```xml From="0" To...
- 在UserControl1.xaml.cs文件中编写控件的逻辑代码。 4. **调整项目设置**: - 在解决方案资源管理器中,选中"MyLibrary"项目; - 点击“项目”菜单 -> “MyLibrary属性”; - 在弹出的属性页中,切换到“应用...
WPF自带的控件中只有Datepicker这个控件,不足以满足功能,鉴于WPF强大的自定义控件Usercontrol的功能,所以修改了一个支持选择日期时间控件---DateTimePicker,
这通常通过创建一个新的UserControl类并在XAML中绘制控件的布局来完成。在XAML中,我们可以使用形状元素如Path、Rectangle或Polygon来构建温度计的玻璃管、刻度线、指针等部分。例如: ```xml <UserControl x:Class...
public partial class CustomMessageBox : UserControl { public static readonly DependencyProperty MessageProperty = DependencyProperty.Register( "Message", typeof(string), typeof(CustomMessageBox), ...
4. **使用用户控件**:在主窗口或者其他视图中,通过`<UserControl>`标签引入创建的用户控件,并将需要的数据绑定到对应的视图模型属性上。 **WpfApplication2示例** 在提供的"**WpfApplication2**"项目中,可能...
在WPF项目中,可以创建一个新的UserControl,包含MediaElement和Slider控件。将Slider.Value绑定到MediaElement.Position,同时处理MediaElement的Seeked事件,以确保当视频播放位置改变时,滑块的值也会同步更新。 ...
在这个UserControl中,我们将放置一系列的Button控件,每个Button代表键盘上的一个键。为了实现键盘字体随键盘大小自适应,我们可以为Button绑定一个数据模板,其中包含一个TextBlock控件。TextBlock的字体大小可以...
接下来,我们需要为屏保创建一个用户控件(UserControl)。这将是屏保的主要内容区域,可以通过XAML定义其布局和元素。例如,可以包含动画效果、图片轮播、动态文本或其他互动元素。在XAML中,可以使用故事板...
可以创建一个新的UserControl,并在其中放置TextBlock或Label来显示时间。为了增加视觉吸引力,可以应用样式、模板和转换器: ```xml <UserControl x:Class="ClockControl"> , Converter={StaticResource ...
首先,理解WPF中的窗口(Window)和用户控件(UserControl)的概念是关键。窗口是应用程序的顶级窗口,可以包含多个用户控件。用户控件则是一种可重用的UI组件,可以包含其他控件,是构建界面的基本单元。 1. **...