我有一个新的哲学问题,旨在强调旧的WPF模式与新的UWP模式之间的差异。
我想在UWP环境中扩展具有新属性的标准控件(例如Button),而不是WPF。
在WPF中,我注意到可以使用两个文件创建自定义控件:Themes / Generics.xaml和MyCustomControl.cs。
在UWP中,它只创建.cs文件...这是否意味着如果我想修改一个Button的XAML内容(假设我想创建一个IconButton:一个内容为一个按钮的按钮) SymbolIcon和Textblock),这是不可能的?
我知道我可以使用“用户控件”,但它是一个通用控件,我会丢失我想要自定义的控件的所有属性(例如在我的情况下,Click事件等)。 ..我甚至可以扩展用户控件以包含所需控件的所有属性......但这需要很长时间。
重点:在UWP环境中,通过代码和Xaml定制和扩展标准XAML控件的最佳和正确方法是什么?
作为一个例子,想想一个经典的任务:创建一个IconButton,正如我上面所说的......一个带有它的内容的按钮,其中包含一个带有SymbolIcon和Textblock作为孩子的网格。
谢谢。
答案 0 :(得分:2)
定制和扩展标准的最佳和正确方法是什么 在UWP环境中按代码和Xaml进行XAML控制?
简单回答:您可以使用模板化控制模板。
有一个video,你可以从这个视频开始30分钟。
一般来说,我们有两种方式来自定义控件:
对于UserControl,它用于轻量级自定义,您只需在自己的项目中使用它。 对于模板控制,它是我们自定义控件的基本方法。 对于您的场景,实际上它在这里不会有太多差异,您可以继承您想要的控件,然后使用代码级别和Xaml级别的代码对其进行自定义。
答案 1 :(得分:2)
你想要这样的东西---
<强> XAML 强>
如果你有单键---
<Button>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" FontFamily="Segoe MDL2 Assets" Text="" HorizontalAlignment="Center"/> <!-- alternately use your icon image -->
<TextBlock Grid.Row="1" Text="Click me!"/>
</Grid>
</Button>
<强>输出强>
如果您有多个按钮使用该模板 -
步骤 -
1)创建一个类&#34; ButtonWithIcon.cs&#34;或者xyz.cs。
public class AdvancedButton : Button
{
public static readonly DependencyProperty IconContentProperty =
DependencyProperty.Register("Icon", typeof(string), typeof(AdvancedButton), new PropertyMetadata(default(FontIcon)));
public string Icon
{
get { return (string)GetValue(IconContentProperty); }
set { SetValue(IconContentProperty, value); }
}
}
2)然后在你的Page.xaml(仅适用于一个页面)或app.xaml(用于整个应用程序)中添加该模板
<Style x:Key="AdvancedButtonTemplate" TargetType="local:AdvancedButton">
<Setter Property="Background" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/>
<Setter Property="Foreground" Value="{ThemeResource SystemControlForegroundBaseHighBrush}"/>
<Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundTransparentBrush}"/>
<Setter Property="BorderThickness" Value="{ThemeResource ButtonBorderThemeThickness}"/>
<Setter Property="Padding" Value="8,4,8,4"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}"/>
<Setter Property="FontWeight" Value="Normal"/>
<Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}"/>
<Setter Property="UseSystemFocusVisuals" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:AdvancedButton">
<Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<PointerUpThemeAnimation Storyboard.TargetName="RootGrid"/>
</Storyboard>
</VisualState>
<VisualState x:Name="PointerOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseMediumLowBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/>
</ObjectAnimationUsingKeyFrames>
<PointerUpThemeAnimation Storyboard.TargetName="RootGrid"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseMediumLowBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightTransparentBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightBaseHighBrush}"/>
</ObjectAnimationUsingKeyFrames>
<PointerDownThemeAnimation Storyboard.TargetName="RootGrid"/>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="RootGrid">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundBaseLowBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledBaseLowBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlDisabledTransparentBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="FontIcon" Grid.Row="0" Text="{Binding Icon, RelativeSource={RelativeSource TemplatedParent}}" Width="40" Foreground="{TemplateBinding Foreground}" FontSize="32" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5" FontFamily="Segoe MDL2 Assets"/>
<TextBlock x:Name="Text" Grid.Row="1" Text="{TemplateBinding Content}" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}" TextAlignment="Center" RenderTransformOrigin="0.5,0.5"/>
<ContentPresenter x:Name="ContentPresenter" Grid.Row="0" Grid.RowSpan="2" ContentTemplate="{TemplateBinding ContentTemplate}" ContentTransitions="{TemplateBinding ContentTransitions}" Content="" AutomationProperties.AccessibilityView="Raw" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
3)然后在您想要的页面中使用该自定义按钮
<local:AdvancedButton Height="55" Width="250" Style="{StaticResource AdvancedButtonTemplate}" Content="New" Icon="" BorderThickness="1" BorderBrush="Black" />
4)构建解决方案否则会显示蓝色错误下划线。
<强>输出强>
注意:这里我根据我的正常理解自定义模板,您需要根据需要在模板中自定义一些字体大小和样式,如果您需要在模板中的文本块中添加边距,请查看最后3个元素& #34; textblocks&#34;,&#34;内容演示者&#34;。