2013-05-21 34 views
9

Tôi muốn đặt Button 's Content đến Path được xác định trong Resources. Vì vậy, tôi đã tạo UserControl, được xác định Path, hai Brushes và nút Style trong tài nguyên ... và mọi thứ đều ổn.Đường dẫn từ tài nguyên dưới dạng nội dung của nút

<UserControl ...> 
    <UserControl.Resources> 
     <Path x:Key="PageSmallIcon2" Stretch="Fill" Fill="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" Stroke="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Control}}, Path=Foreground}" SnapsToDevicePixels="True" Data="F1 M 19,25L 27,25L 27,33L 19,33L 19,25 Z M 19,36L 27,36L 27,44L 19,44L 19,36 Z M 31,25L 57,25L 57,33L 31,33L 31,25 Z M 19,47L 27,47L 27,55L 19,55L 19,47 Z "/> 
     <SolidColorBrush x:Key="MainColorBrush2" Color="Orange"/> 
     <SolidColorBrush x:Key="WhiteColorBrush2" Color="WhiteSmoke"/> 
     <Style x:Key="TransparentButtonStyle2" TargetType="{x:Type Button}"> 
      <Setter Property="Foreground" Value="{StaticResource WhiteColorBrush2}"/> 
      <Setter Property="Height" Value="25"/> 
      <Setter Property="Width" Value="25"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Grid> 
          <Rectangle Fill="Transparent"/> 
          <ContentPresenter x:Name="contentPresenter" Content="{TemplateBinding Content}" Margin="2" /> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsPressed" Value="True"> 
           <Setter Property="Foreground" Value="{StaticResource MainColorBrush2}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </UserControl.Resources> 
    <Grid> 
     <Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> 
     ... 
    </Grid> 
</UserControl> 

Tôi quyết định đặt các tài nguyên đó vào riêng biệt ResourceDictionaries. Tôi dự định có thêm PathsBrushes ... Ngoài ra, tôi muốn chỉ có một kiểu cho nút. Về cơ bản tôi đang làm điều này, bởi vì tôi đã có phong cách cho mỗi nút của tôi và Path cho mỗi Button cụ thể là một phần của ControlTemplate của Button.

Vì vậy, tôi đã tạo ra ba ResourceDictionariesColors.xaml, Icons.xamlControls.xaml và sau đó tôi được cập nhật App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Theme/Colors.xaml"/> 
      <ResourceDictionary Source="Theme/Icons.xaml"/> 
      <ResourceDictionary Source="Theme/Controls.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Bây giờ Path 's Fill bất động sản không được cập nhật khi tôi nhấn mà Button. Ai có thể vui lòng giải thích lý do tại sao nó không hoạt động trong riêng biệt ResourceDictionaries và cung cấp cho tôi giải pháp cho vấn đề này?

CẬP NHẬT

Vì vậy, tôi phát hiện ra vấn đề đó là trong Path. Khi tôi có điều đó Path trong <UserControl.Resources>, màu sắc trong Colors.xaml và kiểu nút trong Controls.xaml mọi thứ hoạt động trở lại.

Tôi cũng phát hiện ra rằng khi tôi có tôi Path trong Icons.xaml và tôi sử dụng nó trong UserControl của tôi như là nội dung của nút

<Button Command="{Binding Path=SmallPageSizeCommand}" Style="{StaticResource TransparentButtonStyle2}" Content="{StaticResource PageSmallIcon2}"/> 

và tôi có nhiều trường hợp của UserControl tôi ... sau đó Path chỉ hiện diện trong một ví dụ của một UserControl tại một thời điểm.

+0

Mọi thứ đều ổn với tôi. Bạn có nhận được bất kỳ lỗi nào trong Cửa sổ đầu ra có trình gỡ lỗi được đính kèm không? Miễn là bạn bao gồm Colors.xaml của bạn trước khi Controls.xaml, bạn sẽ nhận được kết quả mong muốn. –

+0

@NovitchiS No. Không có Lỗi trong Cửa sổ Đầu ra. –

+2

Vấn đề thứ hai từ bản cập nhật là vì bạn đang cho cùng một phần tử cha mẹ khác nhau trong XAML. Đối với nhiều 'Nút' bạn đang thiết lập cùng một' Đường dẫn', được định nghĩa là tài nguyên, như 'Nội dung 'của' Nút'. Để giải quyết điều này, bạn có thể đánh dấu tài nguyên bằng thuộc tính 'x: Shared =" False ". Trong trường hợp này Trình phân tích XAML sẽ tạo ra một cá thể mới của phần tử Đường dẫn cho mỗi Tham chiếu. –

Trả lời

13

Lý do:

Tôi có nhiều trường hợp của UserControl của tôi ... sau đó con đường có mặt chỉ trong một trường hợp của một usercontrol tại một thời điểm

là bởi vì bạn đang đưa ra các cùng một phần tử cha mẹ khác nhau trong XAML. Bạn đang đặt nội dung của nhiều điều khiển Button thành PathShape được xác định trong tài nguyên. Đối với mục đích tối ưu, mỗi tham chiếu đến một tài nguyên sẽ trả về mặc định cùng một đối tượng của đối tượng và vì trong WPF mỗi phần tử chỉ có thể có một phụ huynh tại một thời điểm, chỉ Button cuối cùng trong khai báo XAML của bạn sẽ được đặt thành nội dung mong muốn Path . Để giải quyết vấn đề này, bạn có thể đánh dấu tài nguyên bằng thuộc tính x: Shared = "False". Trong trường hợp này Trình phân tích XAML sẽ tạo ra một cá thể mới của phần tử Đường dẫn cho mỗi Tham chiếu.

+3

Có vẻ như mặc định này là ngược. Tại sao bạn sẽ tài nguyên một cái gì đó nếu bạn không thực sự chia sẻ nó? –

Các vấn đề liên quan