2009-12-04 32 views
5

Tôi đang tạo kiểu thay đổi ControlTemplate của một Nút (nó thực sự thêm mũi tên ở bên phải, để nút trông giống như nút thả xuống (bị thiếu trong wpf)).WPF: Làm thế nào để có mẫu nút tùy chỉnh sử dụng nền nút của hệ thống theo mặc định?

Bên trong mẫu, tôi đặt nút thực (vì tôi cần kết quả vẫn như nút - tôi chỉ có thể thay đổi ContentTemplate, nhưng tôi cần hiển thị nội dung thực tế cùng với mũi tên và đặt ContentPresenter bên trong sản lượng ContentTemplate tràn - wpf chỉ mở rộng mẫu vào trình trình bày và tiếp tục và bật), cùng với mũi tên.

Vấn đề của tôi là tôi muốn người dùng có thể thay đổi nền của nút, vì vậy tôi cần phải ràng buộc Background="{TemplateBinding Background}". Với điều này, người dùng sẽ phải luôn luôn cung cấp nền, nếu không nó sẽ là null. Để ngăn chặn điều này, tôi hiểu rằng tôi cần cung cấp giá trị mặc định cho nền, vì vậy tôi đã thêm <Setter Property="Background" Value="default Background goes here"/>

Câu hỏi đặt ra là giá trị của thiết lập này là gì? Tôi giả sử rằng các kiểu dựng sẵn của wpf được nạp tự động cho mọi ứng dụng và tôi đã xem xét aero.normalcolor.xaml, ở đây chúng cung cấp kiểu ButtonNormalBackground và sau đó sử dụng nó làm kiểu nút mặc định <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> (aero.normalcolor.xaml, dòng 47)).

Chính xác những gì tôi muốn, tuy nhiên, khi tôi sử dụng bộ đặt này, tài nguyên tĩnh không được tìm thấy. Sau đó tôi đã thay đổi nó thành DynamicResource, nhưng trong trường hợp đó, nền của nút vẫn trong suốt - ButtonNormalBackground không được sử dụng!

Làm cách nào để cung cấp nút của hệ thống trông giống như giá trị mặc định? Cảm ơn bạn!

PS: dtto cho BorderBrush, BorderThickness - geez, có vẻ như tôi không được phép những thủ đoạn mà WPF tác giả sử dụng tất cả các thời gian:/

phong cách của tôi:

<Style TargetType="{x:Type ToggleButton}" x:Key="DropDownArrowStyle"> 
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> 
    <Setter Property="ToggleButton.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <ToggleButton 
        x:Name="PART_ToggleButton" 
        Margin="{TemplateBinding Margin}" 
        Padding="{TemplateBinding Padding}" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" 
        VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" 
        IsEnabled="{TemplateBinding IsEnabled}" 
        IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" 
        ContextMenu="{TemplateBinding ContextMenu}" 
        Background="{TemplateBinding Background}" 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}" 
        Foreground="{TemplateBinding Foreground}" 
        FocusVisualStyle="{TemplateBinding FocusVisualStyle}" 
        ClickMode="{TemplateBinding ClickMode}" 
        > 
        <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*" /> 
          <ColumnDefinition Width="Auto" /> 
         </Grid.ColumnDefinitions> 
         <ContentPresenter 
          x:Name="ButtonContentPresenter" 
          HorizontalAlignment="Left" 
          VerticalAlignment="Stretch" 
          Margin="{TemplateBinding Padding}" 
          Content="{TemplateBinding Content}" 
          Grid.Column="0" 
          /> 
         <Border 
          x:Name="PART_DownArrowBorder" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          Background="Transparent" 
          Focusable="False" 
          Grid.Column="1" 
          > 
          <Path 
           Focusable="False" 
           x:Name="PART_DownArrow" 
           Data="M 3,0 L 6.5,4 L 10,0" 
           Width="12" 
           HorizontalAlignment="Right" 
           VerticalAlignment="Center" 
           Fill="Black" SnapsToDevicePixels="True" 
           > 
          </Path> 
         </Border> 
        </Grid> 
       </ToggleButton> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

liên quan: http://stackoverflow.com/questions/628483/how-can-i-set-a-wpf-controls-color-to- a-system-color-programatically-so-that-i –

Trả lời

0

Bạn cần phải xác định các màu bạn muốn sử dụng và tham khảo các màu sắc hệ thống:

tức

<SolidColorBrush 
    Color="{DynamicResource {x:Static SystemColors.HighlightColorKey}}" 
    x:Key="ButtonLinkBackground"/> 

hoặc

<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/> 

Thông tin thêm về SystemColors sẵn How can I list colors in WPF with XAML?

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