Ресурсный словарь в пользовательском управлении - PullRequest
3 голосов
/ 05 марта 2012

У меня есть пользовательский элемент управления, и он использует словари ресурсов.В этом пользовательском элементе управления есть другой пользовательский элемент управления, который использует те же словари ресурсов. Я хочу знать, действительно ли wpf загружает его дважды, и если да, то есть ли какое-либо влияние на производительность.Есть ли лучший способ сделать это.

Заранее спасибо.

1 Ответ

1 голос
/ 05 марта 2012

Интересный вопрос. Я был достаточно заинтригован, чтобы расследовать. Похоже, что WPF загружает новый ResourceDirectionary (и все определенные ресурсы и используемый словарь) для каждого появления элемента.

Взгляните на следующий код:

ViewModel:

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public Person() { }
}

Ресурс (Dictionary1.xaml):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:so="clr-namespace:SO"
    >
    <so:Person x:Key="m" name="Methuselah" age="969" />
</ResourceDictionary>

Вид:

<Window
    x:Class="SO.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:so="clr-namespace:SO"
    Height="200" Width="300"
    Title="SO Sample"
    >
    <Window.Resources>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </Window.Resources>

    <StackPanel DataContext={StaticResource m}>
        <UserControl>
            <UserControl.Resources>
                <ResourceDictionary Source="Dictionary1.xaml" />
            </UserControl.Resources>
            <TextBlock x:Name="inner" DataContext="{StaticResource m}" Text="{Binding Path=name}" />
        </UserControl>        
        <TextBlock x:Name="outer" Text="{Binding Path=name}" />        
        <Button Click="Button_Click">Change</Button>        
    </StackPanel>
</Window>

Поместите точку останова в конструктор Person () и обратите внимание, что объект создается дважды. Или сделайте Person, реализующий INotifyPropertyChange, и добавьте следующий код для Button_Click:

private void Button_Click( object sender, RoutedEventArgs e ) {
    Person innerPerson = this.inner.DataContext as Person;
    Person outerPerson = this.outer.DataContext as Person;
    innerPerson.name = "inner person";
    outerPerson.name = "outer person";
}

Если вы хотите, чтобы у каждого ресурса был один экземпляр, укажите значения в элементе файла app.xaml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...