使用资源字典合并XAML文件

时间:2019-01-28 02:22:36

标签: c# xaml dictionary resources

关于合并两个XAML文件的信息有点令人困惑,有人可以向我指出正确的方向吗? (W10,VS2017,UAP,Midi)

我有app.xamlMainPage.xamlA.xaml。我也有一个xaml资源字典。我想将A.xaml插入MainPage.xaml中。 (A实际上称为MidiWrapper.xaml

app.xaml

<Application
x:Class="Kawai_ES110_Midi.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>

How can i combine multiple XAML files using C# in WPF?之后,当我将第一个解决方案放入app.xaml时遇到访问冲突

MainPage.xaml

<Page
x:Class="Kawai_ES110_Midi.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Kawai_ES110_Midi"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">


<Grid>
<Grid.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="XAMLWrapper.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Grid.Resources>
</Grid>
</Page>

A.xaml(又名MidiWrapper.xaml

<ResourceDictionary
x:Class="Kawai_ES110_Midi.MidiWrapper"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Kawai_ES110_Midi"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <ListBox x:Name="midiInPortListBox"/>
        <ListBox x:Name="midiOutPortListBox"/>
</ResourceDictionary>

资源字典xaml aka(XAMLWrapper.xaml

<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>

非常感谢您的帮助。也许app.xaml需要引用资源字典和/或将“合并的”标签放入MainPage和A。或者MainPage和A也必须像词典一样/作用? 我已经更新了代码,但看不到列表框仍然显示

1 个答案:

答案 0 :(得分:1)

我不确定您尝试使用资源字典执行的操作是否可行。资源字典就是这样,它是XAML的资源清单,因此您可以在其中定义样式或模板等。然后,使用资源的XAML会引用这些样式。我从未尝试在一个元素中定义元素,但我认为您无法使用它初始化一个网格(这是我想您要尝试做的事情?)。

编辑:

重新阅读原始文章以及评论,我认为您根本不需要资源词典。您想要的是一个单独的用户控件。您可以在此here上找到信息,但作为一个简短示例,我创建了一个WPF项目并添加了2个用户控件,其中1个控件包含一个列表,而一个控件包含一个按钮。

Mainwindow.xaml

<Window x:Class="test.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:test"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <local:ListUserControl Grid.Column="0" Grid.Row="0"/>
        <local:ButtonUserControl Grid.Column="0" Grid.Row="1"/>
    </Grid>
</Window>

ListUserControl.xaml

<UserControl x:Class="test.ListUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:test"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" Background="White">
    <StackPanel>
        <ListBox>
            <ListBoxItem>ListBox Item #1</ListBoxItem>
            <ListBoxItem>ListBox Item #2</ListBoxItem>
            <ListBoxItem>ListBox Item #3</ListBoxItem>
        </ListBox>
    </StackPanel>
</UserControl>

ButtonUserControl.xaml

<UserControl x:Class="test.ButtonUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:test"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" Background="DarkRed">
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="10,10,10,10" VerticalAlignment="Top" Width="75"/>
    </Grid>
</UserControl>

这实现了我认为您要实现的元素之间的分离。因此,这应该使您可以构成几个用户控件的视图,其中每个控件都是控件的集合(可能是其他用户控件,但这可能会变得凌乱)。这也可以使用here中所述的数据模板来实现,您可以在其中看到内容根据适用的模板进行了更改。您可以在资源字典中定义模板并以这种方式引用它们。我认为this也可能值得一提,因为它虽然与您的问题没有直接关系,但它概述了可以在应用程序中细分内容的各种方式,并进行了一些相关的讨论。