如何在UWP中快速复制仅少量属性不同的UI控件?
简便创建复用属性的TextBlock控件(UWP)
嗨,在UWP里要避免重复写TextBlock的属性代码,有几个非常实用的简便方案,我给你梳理一下:
方法1:创建工厂方法(最推荐,易维护)
写一个专门生成TextBlock的工具方法,把所有通用属性都在方法里统一设置,只把需要自定义的参数(比如前景色、文本内容)传进去就行。这样后续要修改通用属性,只需要改这一个方法:
private TextBlock CreateStyledTextBlock(Brush foregroundBrush, string displayText) { var textBlock = new TextBlock(); // 设置通用属性 textBlock.FontSize = 20; textBlock.HorizontalAlignment = HorizontalAlignment.Left; textBlock.VerticalAlignment = VerticalAlignment.Top; textBlock.Margin = new Thickness(9, 16, 0, 0); // 应用自定义属性 textBlock.Foreground = foregroundBrush; textBlock.Text = displayText; return textBlock; }
用的时候就超省心:
// 生成原来的白色TextBlock var tb1 = CreateStyledTextBlock(new SolidColorBrush(Colors.White), dataModel.playList_orderNum[i].ToString()); // 生成修改前景色的新TextBlock var tb11 = CreateStyledTextBlock(new SolidColorBrush(Colors.Black), dataModel.playList_orderNum[i].ToString());
方法2:克隆已有控件的属性
如果已经有了tb1这个实例,也可以直接复制它的通用属性,再修改需要自定义的部分。注意引用类型(比如Brush)最好重新实例化,避免多个控件共用同一个实例导致属性联动:
var tb11 = new TextBlock(); // 复制通用属性 tb11.FontSize = tb1.FontSize; tb11.HorizontalAlignment = tb1.HorizontalAlignment; tb11.VerticalAlignment = tb1.VerticalAlignment; tb11.Margin = tb1.Margin; tb11.Text = tb1.Text; // 修改自定义属性 tb11.Foreground = new SolidColorBrush(Colors.Black);
这个方法适合临时复用已有控件的场景,但如果要批量创建多个控件,还是工厂方法更高效。
方法3:使用XAML Style(跨页面复用)
如果你的项目更偏向XAML和代码结合的开发模式,可以定义一个基础Style,把通用属性都放在Style里,然后代码中直接应用Style再修改差异化属性:
首先在XAML的资源中定义Style:
<Page.Resources> <Style x:Key="BaseTextBlockStyle" TargetType="TextBlock"> <Setter Property="FontSize" Value="20"/> <Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="VerticalAlignment" Value="Top"/> <Setter Property="Margin" Value="9,16,0,0"/> </Style> </Page.Resources>
然后在代码中使用:
var tb1 = new TextBlock(); tb1.Style = Resources["BaseTextBlockStyle"] as Style; tb1.Foreground = new SolidColorBrush(Colors.White); tb1.Text = dataModel.playList_orderNum[i].ToString(); var tb11 = new TextBlock(); tb11.Style = Resources["BaseTextBlockStyle"] as Style; tb11.Foreground = new SolidColorBrush(Colors.Black); tb11.Text = dataModel.playList_orderNum[i].ToString();
这种方式的Style可以在多个页面复用,非常适合统一控件样式的场景。
内容的提问来源于stack exchange,提问作者Tom Xue
相关产品推荐
相关产品推荐

