标签: controltemplate

预制WPF样式/控件模板的在线资源?

在UI设计方面,我通常不关心自定义样式(外观方面),我不是一个艺术家,我讨厌尝试提出有趣的配色方案等.是否有任何预制WPF样式和/或控件模板的在线存储库?我可以发誓我之前看过一个,但我现在找不到它,它可能会消失.

只是好奇你们是否知道这样的事情.能够将预制样式放入我的应用程序中以使其更加美观,真是太棒了.

wpf styles controltemplate

3
推荐指数
1
解决办法
1346
查看次数

将Canvas设置为控件模板?

我在ResourceDictionary xaml文件中有一个Canvas,如下所示:

<Canvas x:Key="Icon">
     <Path ... />
     <Path ... />
</Canvas>
Run Code Online (Sandbox Code Playgroud)

在我的代码隐藏中,我使用加载此图标

LayoutGrid.Children.Add(FindResource("Icon") as Canvas);
Run Code Online (Sandbox Code Playgroud)

这很好用.现在我想创建一个使用相同图标作为模板的按钮.所以我创建了一个控件模板:

<ControlTemplate x:Key="IconTemplate">
    ...
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

现在问题是:如何将"Icon"资源画布放入控件模板?据我所知,Canvas没有Style或Template属性.它有一个儿童酒店,但无法通过XAML访问.我如何在模板中使用我的画布?

wpf canvas controltemplate

3
推荐指数
1
解决办法
9328
查看次数

根据WPF中的模板在运行时创建具有不同内容的TabItem

我正在使用WPF编写应用程序,其中一部分涉及为用户管理各种文件,这些文件用于配置自定义的内部设备.我需要能够在同一个TabControl中的选项卡中操作不同类型的配置,这意味着必须动态生成TabItems的内容.我想用ControlTemplates做到这一点,但我还没有成功获得一个工作模板.我在我的Window资源中定义了一个名为"pendantConfigurationTabItemTemplate"的ControlTemplate,我使用以下代码将模板(包含我需要访问的命名项)应用到TabItems并将它们添加到它们的父TabControl:

<ControlTemplate x:Key="pendantConfigurationTabItemTemplate" TargetType="TabItem">
    <StackPanel Orientation="Vertical">
        <my:PendantConfigurationFileEditor x:Name="configurationEditor"/>
        <StackPanel Style="{StaticResource defaultOkCancelButtonsContainerStyle}">
            <Button Style="{StaticResource defaultOkCancelButtonStyle}"/>
            <Button Style="{StaticResource defaultOkCancelButtonStyle}" Click="OkButton_Click"/>
        </StackPanel>
    </StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

代码背后:

TabItem ConfigTab = new TabItem();

switch (ConfigFile.Device)
{
  case DeviceType.PENDANT:
{
  ControlTemplate TabTemplate = Resources["pendantConfigurationTabItemTemplate"] as ControlTemplate;

  ConfigTab.Template = TabTemplate;
  ConfigTab.ApplyTemplate();

  object Editor = TabTemplate.FindName("configurationEditor", ConfigTab);

  PendantConfigurationFileEditor ConfigFileEditor = Editor as PendantConfigurationFileEditor;

  ConfigFileEditor.PendantConfiguration = DeviceConfig;

  break;
}
default:
  /* snipped */
  return;
}

ConfigTab.Header = ConfigFile.ConfigurationName;

this.EditorTabs.Items.Add(ConfigTab);
this.EditorTabs.SelectedIndex = this.EditorTabs.Items.Count - 1;
Run Code Online (Sandbox Code Playgroud)

但是,每当我运行程序时,没有选项卡添加到选项卡控件,而是选项卡控件(看似)被模板内容替换或覆盖.有人可以帮我解决这个问题吗?

实际上,我想要做的是将WPF模板用作TabItem工厂

wpf tabcontrol controltemplate tabitem

3
推荐指数
1
解决办法
6841
查看次数

设置ComboboxItem的MaxWidth,使Items宽度不超过ComboboxWidth

以下是它现在的样子:

Combobox与大件物品

我希望ComboBoxItems的宽度与ComboBox.我已经覆盖了ComboBox和的默认模板ComboBoxItem.

ComboBoxItem风格:

<Style x:Key="{x:Type ComboBoxItem}"
       TargetType="{x:Type ComboBoxItem}">
    <Setter Property="SnapsToDevicePixels"
            Value="true" />
    <Setter Property="OverridesDefaultStyle"
            Value="true" />
    <Setter Property="FocusVisualStyle"
            Value="{x:Null}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                <Border Name="Border"
                        Padding="2"
                        SnapsToDevicePixels="true">
                    <ContentPresenter />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsHighlighted"
                             Value="true">
                        <Setter TargetName="Border"
                                Property="Background"
                                Value="#9982B5D8" />
                    </Trigger>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter Property="Foreground"
                                Value="#888888" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

ComboBox 样式:

 <Style x:Key="{x:Type ComboBox}"
       TargetType="{x:Type ComboBox}">
    <Setter Property="SnapsToDevicePixels"
            Value="true" />
    <Setter Property="OverridesDefaultStyle"
            Value="true" /> …
Run Code Online (Sandbox Code Playgroud)

wpf templates combobox styles controltemplate

3
推荐指数
1
解决办法
6852
查看次数

模板部分发现

这可能是一个愚蠢的问题(我真的是 WPF 的新手),但是在 Visual Studio 的 Xaml 编辑器中覆盖控件外观时,是否有一种简单的方法可以自动发现可用的模板部分 (PART_*)?

我知道我可以使用 Reflector 之类的工具或查看文档。我在这里寻找的是效率。当然,某处必须有一个上下文的、类似智能感知的帮助程序,当我在编辑器的上下文菜单中键入或单击按钮时,它会显示可用的 TemplatePart 详细信息?我不可能是唯一一个觉得它有用的人?!

wpf controltemplate visual-studio

3
推荐指数
1
解决办法
556
查看次数

通过&lt;tab&gt;接收焦点时修改按钮样式,但单击时不修改

我想做的事

在用户界面上切换时,大多数WPF控件在接收到键盘焦点时会显示一个虚线边框。用鼠标单击它们时,它们不会显示此边框。

我有一个带有自定义控件模板的按钮,并且我希望具有与上述相同的行为,但是我不仅要添加边框,还想修改按钮本身的外观。

我尝试了什么

  • 自定义FocusVisualStyle。这没有给我足够的灵活性,因为由设置的模板FocusVisualStyle添加到按钮的顶部。据我所知,这不能用于以任何方式修改(样式,动画,...)按钮本身。

  • 使用带有IsFocused和/或IsKeyboardFocused属性的触发器以及带有Got/LostFocus和/或Got/LostKeyboardFocus事件的EventTriggers 对按钮进行样式设置。这也不起作用,因为当我也单击按钮时,所有这些似乎都被触发了。

范例程式码

<StackPanel VerticalAlignment="Center" Width="150">

    <StackPanel.Resources>

        <ControlTemplate x:Key="CustomButtonTemplate" TargetType="Button">
            <!--A simple black border with a content presenter-->
            <Border BorderBrush="Black" BorderThickness="1" CornerRadius="2">
                <ContentPresenter x:Name="Presenter" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" />
            </Border>
            <ControlTemplate.Triggers>
                <!--When receiving keyboard focus modify the button text-->
                <Trigger Property="IsKeyboardFocused" Value="True">
                    <Setter TargetName="Presenter" Property="Content" Value="I have keyboard focus" />
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

        <Style x:Key="CustomFocusVisualStyle" TargetType="Control">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate> …
Run Code Online (Sandbox Code Playgroud)

.net c# wpf xaml controltemplate

3
推荐指数
1
解决办法
1184
查看次数

.Net MAUI 中单选按钮样式的问题

我在 .Net MAUI 中设置单选按钮样式时遇到了一些问题。最初,我注意到 Windows 和 Android 上的单选按钮外观并不一致,如下图所示:

单选按钮的外观

它们不仅不同,而且按钮样式的可用选项也很有限。定义颜色的唯一选项是“BorderColor”、“BackgroundColor”和“TextColor”。“BorderColor”和“BackgroundColor”对单选按钮本身的颜色完全没有影响。我想更改实际单选按钮的颜色。

所以我决定创建一个控制模板来帮助我。这是我的控件模板:

<ControlTemplate x:Key="RadioButtonTemplate">
    <Border Stroke="Transparent" BackgroundColor="Transparent">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroupList>
                <VisualStateGroup x:Name="CheckedStates">
                    <VisualState x:Name="Checked">
                        <VisualState.Setters>
                            <Setter TargetName="check" Property="Opacity" Value="1" />
                        </VisualState.Setters>
                    </VisualState>
                    <VisualState x:Name="Unchecked">
                        <VisualState.Setters>
                            <Setter TargetName="check" Property="Opacity" Value="0" />
                        </VisualState.Setters>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateGroupList>
        </VisualStateManager.VisualStateGroups>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="20" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Grid WidthRequest="20" HeightRequest="20" Grid.Column="0" VerticalOptions="Center" HorizontalOptions="Center">
                <Ellipse x:Name="border_circle" StrokeThickness="2" Stroke="DarkBlue" Fill="White" WidthRequest="18" HeightRequest="18" HorizontalOptions="Center" VerticalOptions="Center" />
                <Ellipse x:Name="check" Fill="DarkBlue" WidthRequest="10" HeightRequest="10" HorizontalOptions="Center" VerticalOptions="Center" />
            </Grid>
            <ContentPresenter Margin="10,0,0,0" Grid.Column="1" HorizontalOptions="Start" …
Run Code Online (Sandbox Code Playgroud)

xaml controltemplate radio-button maui

3
推荐指数
1
解决办法
3094
查看次数

我的datatrigger绑定有什么问题?

我创建了一个附加属性来扩展具有附加状态的Button类:

<Button v:ExtensionHelper.OperationMode="{Binding MyObject.OperationMode}" 
        Command="{Binding MyObject.Select}" 
        Style="{StaticResource operationModeControlTemplateStyle}" />
Run Code Online (Sandbox Code Playgroud)

然后,我想在访问此值,ControlTemplate使用DataTrigger这样的:

<Style x:Key="operationModeControlTemplateStyle" TargetType="Button">
    <Setter Property="IsHitTestVisible" Value="true" />        
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <Image x:Name="hand" Source="hand.png" />
                    <Image x:Name="cross" Source="cross.png" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Manual">
                        <Setter TargetName="cross" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="hand" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Disabled">
                        <Setter TargetName="cross" Property="Visibility" Value="Visible" />
                        <Setter TargetName="hand" Property="Visibility" Value="Collapsed" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf datatrigger controltemplate attached-properties

2
推荐指数
1
解决办法
7132
查看次数

使用Style时不应用默认自定义ControlTemplate

我为Button创建了一个默认样式,包括一个自定义ControlTemplate,如下所示:

<Style TargetType="{x:Type Button}">
    <Setter Property="OverridesDefaultStyle" Value="True"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="BorderBrush" Value="Black"/>
    <!-- ...other property setters... -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid x:Name="gridMain">
                    <!-- some content here -->
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

此样式将添加到我的共享ResourceDictionary中,该ResourceDictionary由每个控件加载.现在,这个样式/模板按预期应用于我的所有按钮,但它不适用于本地使用不同样式的那些按钮.例如,我希望我的"确定","应用"和"取消"按钮有一定的余量.因此,我定义了以下样式:

<Style x:Key="OKApplyCancelStyle" TargetType="{x:Type Button}">
    <Setter Property="Margin" Value="4,8"/>
    <Setter Property="Padding" Value="8,6"/>
    <Setter Property="MinWidth" Value="100"/>
    <Setter Property="FontSize" Value="16"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

...并使用StaticResource将该样式应用于我的按钮:

<Button Content="OK" Style="{StaticResource OKApplyCancelStyle}"/>
Run Code Online (Sandbox Code Playgroud)

对我来说,预期的结果是仍然会应用上面的ControlTemplate,使用"OKApplyCancelStyle"中的Margin,Padding,MinWidth和FontSize的值.但这种情况并非如此.使用默认的Windows ControlTemplate,使用样式中的值.

这是典型的行为吗?本地样式是否真的覆盖自定义ControlTemplate?如果是这样,我怎样才能实现我想要的行为?即使在本地定义样式,即使仍然使用我的自定义ControlTemplate?

非常感谢,gehho.

wpf controltemplate

2
推荐指数
1
解决办法
895
查看次数

错误模板绑定错误wpf

运行我的应用程序时,我在控制台中收到此错误:

System.Windows.Data Error: 17 : Cannot get 'Item[]' value (type 'ValidationError') from '(Validation.Errors)' (type 'ReadOnlyObservableCollection`1'). BindingExpression:Path=AdornedElement.(0)[0].ErrorContent; DataItem='AdornedElementPlaceholder' (Name='placeholder'); target element is 'TextBlock' (Name=''); target property is 'ToolTip' (type 'Object') ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index'
A first chance exception of type 'NHibernate.Validator.Exceptions.ValidatorConfigurationException' occurred in NHibernate.Validator.dll
Run Code Online (Sandbox Code Playgroud)

我不明白的其中一个问题是应用程序行为很好,单元测试也是如此.

我(显然)在IDataErrorInfo实现的幕后使用了NHibernate验证器,但最重要的是IDataErrorInfo.Error和IDataErrorInfo [columnName]如果有错误将返回单个字符串,如果没有则返回null .

我猜这个异常是因为当没有错误时,没有索引,但是我的错误工具提示的绑定似乎是关于如何做的典型例子.

我的错误模板的绑定如下.

问题:

  1. 如果没有找到错误,IDataErrorInfo [columnName]应该返回null吗?
  2. 是我的错误模板缺乏?validation.HasError部分??
  3. 这甚至是个问题吗?
  4. 如果它是一个问题,它可能与NHib验证器和建议有关?

带有错误模板的文本框样式:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="0,0,16,0" />        
    <!-- Error display -->
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value> …
Run Code Online (Sandbox Code Playgroud)

.net data-binding validation wpf controltemplate

2
推荐指数
1
解决办法
5126
查看次数