WPF Как использовать мой словарь ресурсов, содержащий шаблон данных, на моей главной странице XAML - PullRequest
1 голос
/ 24 октября 2019

Мой словарь ресурсов, который содержит шаблон данных, который я хочу использовать для каждой связанной с ним виртуальной машины.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:viewModel="clr-namespace:IntSimulator.ViewModels.EquipmentVMs"
                xmlns:converters="clr-namespace:IntSimulator.Converters"
                xmlns:local="clr-namespace:IntSimulator.ResourceDictionary">


<converters:ScaleXCoordConverter x:Key="ScaleXCoordConverter"></converters:ScaleXCoordConverter>
<converters:ScaleYCoordConverter x:Key="ScaleYCoordConverter"></converters:ScaleYCoordConverter>

<DataTemplate x:Key="KeyMcKeyface" DataType="{x:Type viewModel:CircuitTrackViewModel}">
    <ItemsControl ItemsSource="{Binding LineCoords}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>

                <!--When we click on the line, it will increase Z-index and change colour, to bring occupied track forward and highlight -->
                <Line
                                            X1="{Binding X1, Converter={StaticResource ScaleXCoordConverter}}" Y1="{Binding Y1, Converter={StaticResource ScaleYCoordConverter}}"
                                            X2="{Binding X2, Converter={StaticResource ScaleXCoordConverter}}" Y2="{Binding Y2, Converter={StaticResource ScaleYCoordConverter}}"
                                            Stroke="{Binding DataContext.Colour.Colour, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" 
                                            StrokeThickness="1" StrokeEndLineCap="{Binding EndLineCap}" StrokeStartLineCap="{Binding StartLineCap}">
                    <Line.InputBindings>
                        <MouseBinding Gesture="LeftClick" Command="{Binding DataContext.OccupyTrackCommand, RelativeSource={RelativeSource AncestorType=ContentPresenter, AncestorLevel=2}}" CommandParameter="True"/>
                    </Line.InputBindings>

                    <Line.RenderTransform>
                        <TranslateTransform X="{Binding DataContext.DisplayViewModel.MainOffsetX, RelativeSource={RelativeSource AncestorType=Window, AncestorLevel=1}}" 
                                                        Y="{Binding DataContext.DisplayViewModel.MainOffsetY, RelativeSource={RelativeSource AncestorType=Window, AncestorLevel=1}}"/>
                    </Line.RenderTransform>

                </Line>

            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</DataTemplate>

Я добавил

<Application.Resources>
    <ResourceDictionary>


            <ResourceDictionary x:Key="CircuitTracksResourceDictionary" Source="ResourceDictionary/CircuitTracksResourceDictionary.xaml"/>


    </ResourceDictionary>

Для моего приложения. Xaml. Теперь я хочу использовать этот словарь ресурсов на своей главной странице xaml, но не знаю, как это сделать.

Я использовал для этого пользовательские элементы управления, например:

   //OLD CODE
    <DataTemplate DataType="{x:Type viewModel:CircuitTrackViewModel}">
                    <userControlLines:CircuitTrackUserControl DataContext="{Binding}"></userControlLines:CircuitTrackUserControl>
                </DataTemplate>

Но это вызывало проблемы с производительностью. В идеале я бы просто хотел разместить шаблон данных на своей главной странице xaml, как это, но используя словарь ресурсов в качестве статического ресурса. Заранее спасибо.

1 Ответ

1 голос
/ 24 октября 2019

Удалите x:Key из вашего DataTemplate, чтобы сделать его неявным:

<DataTemplate DataType="{x:Type viewModel:CircuitTrackViewModel}">

Тогда вам просто нужно объединить ResourceDictionary с вашим App.xaml, чтобы применить его ко всем CircuitTrackViewModelобъекты по всему вашему приложению:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="..." />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...