2011-01-02 47 views
5

Chỉnh sửa:Trong câu hỏi ban đầu, tôi đã đưa ra một số giả định sai về cách người định cư làm việc để tôi sửa đổi nó thành hy vọng chính xác và hữu ích hơn.Có cách nào để sử dụng thiết lập kiểu cho thuộc tính của thuộc tính không?

Tôi đã cố gắng làm cho một số mục menu thú vị hơn bằng cách để các biểu tượng xuất hiện nửa trong suốt nếu con chuột không nằm trên mục. Nếu chuột vào, biểu tượng sẽ được làm động để hiển thị hoàn toàn. Những hình ảnh động làm việc, Storyboard.TargetProperty cho phép truy cập trực tiếp đến tài sản opacity của biểu tượng:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

Nếu tôi cố gắng sử dụng một setter cho ban đầu icon-opacity mã sẽ không biên dịch:

<Setter Property="Icon.Opacity" Value="0.5"/> 

Chỉnh sửa: Người định cư không hoạt động theo cách tôi đã cố gắng sử dụng chúng, bạn không thể truy cập thuộc tính của thuộc tính (xem câu trả lời) Điều duy nhất bạn có thể làm là xác định một lớp mục tiêu nếu loại mục tiêu của phong cách đã không được thiết lập, các phong cách sau đây sẽ tương đương:

<Style x:Key="Style1" TargetType="Image"> 
    <Setter Property="Opacity" Value="0.5"/> 
</Style> 
<Style x:Key="Style2"> 
    <Setter Property="Image.Opacity" Value="0.5"/> 
</Style> 

Vì vậy, câu hỏi của tôi là nếu có một cách để làm điều này bằng cách nào đó làm việc với một setter.

(công việc xung quanh hiện tại của tôi là một kịch bản đơn keyframe được kích hoạt với sự kiện Loaded mà hoạt động khá tốt)

Trả lời

1

Tôi không nghĩ rằng bạn có thể truy cập vào một tài sản của một tài sản như thế nên đúc chính nó không phải là vấn đề. Ngay cả khi Icon là Type Image vẫn không hoạt động. Bạn có thể thử với Opacity nền cho một Grid ví dụ. Bối cảnh là một tài sản phụ thuộc cho Lưới và Opacity là một tài sản phụ thuộc Brush nhưng dòng sau sẽ không làm việc

<Grid Background.Opacity="0.8"/> 

Bạn sẽ nhận được một lỗi nói

'Opacity' Thuộc tính gắn thêm là không được tìm thấy trong loại 'Nền'.

Bạn sẽ phải thiết lập này trong nền bản thân như thế này

<Grid> 
    <Grid.Background> 
     <SolidColorBrush Opacity="0.8"/> 
    </Grid.Background> 
</Grid> 

Vì vậy, điều này có nghĩa là khi bạn làm điều gì đó như thế này

<Grid TextBlock.Foreground="Red"> 
    <TextBlock Text="Test"/> 
</Grid> 

bạn đang thực sự sử dụng đính kèm Thuộc tính Foreground cho TextBlock.

hình ảnh không có tài sản gắn liền gọi Opacity nên bạn không thể làm điều này một trong hai

<MenuItem Image.Opacity="0.8" /> 

Một workaround bên cạnh một bạn đã làm là sử dụng một cái gì đó như thế này (top-nhất MenuItem hoặc bất cứ nơi nào bạn muốn sử dụng nó).

<MenuItem x:Name="topMenuItem" 
      ...> 
    <MenuItem.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </MenuItem.Resources> 
    <!-- ... --> 
</MenuItem> 
+0

Giải pháp được đề xuất của bạn hoạt động nhưng thậm chí còn đau hơn giải pháp khung chính vì trình thiết lập phải ở cùng định nghĩa kiểu vì nó thuộc về hoạt ảnh. Vâng, tôi không mong đợi bất kỳ giải pháp tốt đẹp bởi vì toàn bộ setter và kích hoạt kinh doanh là một chút hạn chế (ví dụ: EventTriggers chỉ làm việc với storyboards và không đơn giản setters) Thanks anyway. –

+0

@HB: Có, tôi đồng ý, giải pháp bạn đang sử dụng tốt hơn nên chỉ cần tiếp tục sử dụng :) Nếu Tài nguyên là DP bạn có thể thêm vào kiểu MenuItem của mình nhưng vì đó không phải là số –

+0

Tôi không hiểu rõ ý bạn là gì, tại sao tài nguyên lại là DP? Nhúng kiểu ảnh trong Style.Resources dường như hoạt động ... –

1

Vì vậy, sau khi đọc câu trả lời Meleak và tìm ra rằng bạn có thể có một phong cách trong một phong cách thông qua các nguồn lực gì có thể đến gần nhất để làm điều này với một setter là một phong cách nhúng để truy cập opacity của biểu tượng. Ở đây tôi giả vào biểu tượng để được một hình ảnh vì vậy tôi sử dụng như là loại mục tiêu, phong cách hoàn toàn do đó trông như thế này:

<Style x:Key="MenuItemMouseOverStyle" TargetType="MenuItem"> 
    <Style.Resources> 
     <Style TargetType="Image"> 
      <Setter Property="Opacity" Value="0.5"/> 
     </Style> 
    </Style.Resources> 
    <Style.Triggers> 
     <EventTrigger RoutedEvent="MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Icon.Opacity"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0.5"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Style.Triggers> 
</Style> 

Vấn đề duy nhất với điều này là nó không thực sự thiết lập các Icon.Opacity nhưng opacity của tất cả các hình ảnh có thể xảy ra trong MenuItem.

+0

+1 cho Style.Resources trong một Style :) –

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