【问题标题】:WPF Dynamic Style ControlWPF 动态样式控制
【发布时间】:2020-09-15 12:19:39
【问题描述】:

我创建了一个 TabControl。在其中,我希望每个“页面”都有不同的样式。所以我试着把 ContentType 搞得一团糟。现在,如果我使用静态引用,它工作得很好,但我想做的是做一些动态的事情。所以我正在考虑在我给 tabcontrol (List_OpenPage.ItemSource = pages) 的类中插入一个字符串,比如 Home。 然后我将 ContentTemplate 设置为如下{StaticResource ResourceKey={Binding Style}} 其中 Style 是对 List 调用页面的引用。 (事实上​​,如果我调用 list.page 我应该得到一个像 home 或 test 这样的字符串)。 这个想法行不通..那么你知道如何让它工作吗?

   <TabControl Name="List_OpenPage" BorderThickness="0" Style="{DynamicResource TabControlStyle1}"  ContentTemplate="{StaticResource Home}">
            <TabControl.Resources>
                <SolidColorBrush x:Key="TabItem.Selected.Background" Color="LightGray"/>
                <SolidColorBrush x:Key="TabItem.Selected.Border" Color="#ACACAC"/>
                <Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}">
        // Some ignorable styling \\
                </Style>
            </TabControl.Resources>

            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Title}" Margin="2" FontSize="13"/>
                </DataTemplate>
            </TabControl.ItemTemplate>

        </TabControl>

-- 数据模板

  <Window.Resources>
    
   <DataTemplate x:Key="Home">
        <ListView ItemsSource="{Binding Datas}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="Red">


         </ListView>

    </DataTemplate>

    <DataTemplate x:Key="test">
        <ListView ItemsSource="{Binding Datas}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="LightGray">


        </ListView>
    </DataTemplate>
  </Window.Resources>
        

//

public class Page
{
    public string Title { get; set; }
    public string Style { get; set; } (will be home or test for this example)
    public List<Result.Data> Datas { get; set; }


}

【问题讨论】:

    标签: wpf xaml binding


    【解决方案1】:

    这样做的方法是定义一个DataTemplateSelector 并使用TabControl.ContentTemplateSelector 属性,例如:

    public class CustomTemplateSelector : DataTemplateSelector
    {
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is Page page)
                return Application.Current.MainWindow?.FindResource(page.Style) as DataTemplate;
    
            return null;
        }
    }
    

    XAML:

    <TabControl ...>
        <TabControl.ContentTemplateSelector>
            <local:CustomTemplateSelector />
        </TabControl.ContentTemplateSelector>
    </TabControl>
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多