2012-03-05 3 views
3

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

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

ответ

1

Интересный вопрос. Я был достаточно заинтригован, чтобы исследовать. Похоже, 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> 

Помещенный точка останова в Персе on() и обратите внимание, что объект создается дважды. Или, сделать лицо, осуществляющее 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"; 
} 

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

Смежные вопросы