【问题标题】:How do you assign the style programmatically [closed]您如何以编程方式分配样式[关闭]
【发布时间】:2016-11-07 16:33:07
【问题描述】:

我正在尝试将我的一种 xaml 样式设置为我页面中的框架。 它是在代码中创建的,并动态分配给布局。

所以我希望我必须动态设置样式?因为框架在 xaml 中不存在。

我想不通的是如何分配自定义模板。或者更好的是,以全局方式适用于任何适合特定类别的框架。标记或键入等。

下面是我试图测试的模板。但它不起作用。假设缺少代码,因此开始检查代码隐藏样式设置,但到目前为止没有运气。

App.xaml

<!-- http://paulstovell.com/blog/wpf-navigation -->
<ControlTemplate TargetType="Frame" x:Key="frame" >
    <DockPanel Margin="7">
        <StackPanel 
            Margin="7"
            Orientation="Horizontal"
            DockPanel.Dock="Top"
            >
                <Button 
                Content="Avast! Go back!" 
                Command="{x:Static NavigationCommands.BrowseBack}" 
                IsEnabled="{TemplateBinding CanGoBack}" 
                />
                <Button 
                Content="Forward you dogs!" 
                Command="{x:Static NavigationCommands.BrowseForward}" 
                IsEnabled="{TemplateBinding CanGoForward}" 
                />
            </StackPanel>

            <Border 
            BorderBrush="Green"
            Margin="7"
            BorderThickness="7"
            Padding="7"
            CornerRadius="7"
            Background="White"
            >
            <ContentPresenter />
        </Border>
    </DockPanel>
</ControlTemplate>

MyWindow.xaml.cs

 Frame newFrame = new Frame();
 newFrame.Content = content;

 newFrame.Template = ControlTemplate ...?

【问题讨论】:

  • 查看其他主题,非常相似:stackoverflow.com/questions/10686917/…
  • 为什么要动态创建东西?你正在努力让自己的事情变得更难。
  • @EdPlunkett 为了提供背景信息,我正在使用 Devexpress 控件。码头面板。这需要我为每个页面添加一个面板。每个面板都需要它的内容,但我希望有导航。所以我在面板中添加了一个框架,并将内容添加到框架中。页面本身,有自己的 xaml 和 cs。不幸的是,devexpress 没有设置导航窗口的样式,所以我需要以某种方式覆盖它
  • 午餐我带了一个火腿三明治,但我把西红柿和泡菜片放在一个带拉链的袋子里,这样面包就不会湿透了。这是一个阳光明媚的日子。有点冷。但与一年中的这个时候差不多。

标签: c# wpf xaml styles


【解决方案1】:

选项 1:

  1. 为您的类型创建一个没有键(隐式)的样式
  2. 在样式中添加 ControlTemplate
  3. 当您添加控件(甚至是从代码中添加)时,它将获得您刚刚创建的默认样式

带有从包含窗口获取 hist 样式的按钮的代码 Ex:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Red"></Setter>
            <Setter Property="Template">
               <ControlTemplate>
                   <... Your Template ...>
               </ControlTemplate>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>

    </Grid>
</Window>

从后面的代码创建按钮:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var button = new Button();
        this.Content = button;
    }
}

选项 2:

  1. 使用键创建样式。
  2. 在样式中添加您的 ControlTemplate
  3. 将样式添加到应用资源中。
  4. 从应用程序资源中获取样式并设置样式(和模板):

代码示例:

var yourStyle = (Style)Application.Current.Resources["Resource_Name"]);

Frame newFrame = new Frame();

newFrame.Style = yourStyle;

【讨论】:

  • 谢谢。我已经让它使用类似的代码。要获取ControlTemplate,然后使用它设置newFrame.Template
  • 太好了,我认为我建议的第一个选项(选项 1)更好更干净。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2015-11-26
  • 2020-07-08
  • 2013-07-04
  • 2010-11-17
相关资源
最近更新 更多