2013-02-13 15 views
7

Mam kontroli przycisk jako zasób w Słowniku Zasobów jak poniżej:Kontrola WPF jako StaticResource w słowniku zasobów, używana w wielu systemach Windows WPF?

<!--ButtonResources.xaml file--> 
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Button x:Key="buttonResource" Content={Binding BoundText}/> 
</ResourceDictionary> 
<!--ButtonResources.xaml file--> 

I teraz to wykorzystać powyżej przycisku sterowania związany właściwości content ContentControl kontroluje w 2 różnych oknach plików .xaml gdzie każdy Window ma swój własny DataContext i dlatego każde okno powinno wyświetlać Content powyższego kontrolka przycisku w oparciu o jego wartość właściwości ViewModel'sBoundText jak poniżej dla każdego okna.

<Window x:Class="TestClass1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="ButtonResources.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ContentControl Content={StaticResource buttonResource}/> 
    </Grid> 
</Window> 

Ale problemem jest to, że wyświetlacz samą wartość zarówno Window dla właściwości BoundText co oznacza, że ​​zarówno WPF Okna mają samo wystąpienie sterowania przycisk z zasobu, używane zarówno w systemie Windows.

Jak mogę rozwiązać ten problem tak, że każde okno dostaje osobną kontrolę przycisk z zasobu i nadal wyświetlać różne wartości dla właściwości BoundText z ich własnym ViewModel?

Edit: Z powodów wskazanych poniżej w MSDN, nie mogę używać x: Shared = "false" atrybut, aby rozwiązać ten:

• The ResourceDictionary, który zawiera elementy nie muszą być zagnieżdżonym w innym pliku ResourceDictionary. Na przykład nie można użyć wartości x: Współdzielona dla elementów w ResourceDictionary, która jest w stylu, w którym jest już elementem ResourceDictionary.

Odpowiedz

8

Próbowałeś użyć atrybutu x:Shared?

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Button x:Shared="False" x:Key="buttonResource" Content={Binding BoundText}/> 
</ResourceDictionary> 

Aby uzyskać więcej informacji, przeczytaj here.

Jeśli to nie zadziała, możesz zapisać szablon w swoim zasobie zamiast przycisku i użyć ContentControl w swoim oknie, aby go wyświetlić.

+0

Dzięki.Ale nie mogę użyć tego atrybutu jako przyczyny wymienionej w mojej ** edycji: ** części pytania. – VS1

+0

Używasz powyższego przykładu, aby użyć następującego znacznika. Loman

+0

Doskonały, x: Współdzielony właśnie rozwiązał mój problem, a także w celu udostępnienia jednej kontrolki w różnych widokach. – usefulBee

3

Spróbuj:

<Style TargetType="Button" x:Key="buttonResource"> 
    <Setter Property="Content" Value="{Binding BoundText}" /> 
</Style>


<Button Style="{StaticResource buttonResource}" /> 
+0

Dzięki. Zaktualizowałem moje pytanie, aby uwzględnić użycie Kontroli treści, w jaki sposób powiązać ContentControl w każdym oknie WPF (.xaml) z zasobem przycisku w słowniku zasobów zgodnie z powyższą odpowiedzią? – VS1

+0

Nie widzę, jak to by było inaczej. Czy możesz opublikować kod ContentControl? – KBoek

+0

Dodałem kod do użycia ContentControl w obu plikach Window.xaml. Rzeczywiste użycie nie jest przyciskiem, ale inną kontrolą i jego, ponieważ chcemy zmienić plik xaml zasobów w przyszłych wersjach bez konieczności zmiany okna. Kod pliku xaml ... – VS1

Powiązane problemy