2010-09-03 65 views
13

Tôi đã cố gắng xây dựng một hộp văn bản có gợi ý hiển thị khi nó trống. Tôi đang gặp sự cố khi đặt văn bản gợi ý từ bên trong một kiểu.WPF Liên kết với thuộc tính cha mẹ từ bên trong phần tử lồng nhau bằng cách sử dụng kiểu

Để được chính xác, này hoạt động (có nghĩa là, nó liên kết một cách chính xác):

<TextBox Tag="hint text"> 
     <TextBox.Background> 
      <VisualBrush Stretch="None"> 
       <VisualBrush.Visual> 
        <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" /> 
       </VisualBrush.Visual> 
      </VisualBrush> 
     </TextBox.Background> 
    </TextBox> 

nhưng, khi tôi di chuyển nó đến kích cỡ, nó không:

<Style TargetType="TextBox" x:Key="stlHintbox"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value=""> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <VisualBrush Stretch="None"> 
         <VisualBrush.Visual> 
          <TextBlock Tag="inner" Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" 
             FontStyle="Italic" Foreground="LightGray" /> 
         </VisualBrush.Visual> 
        </VisualBrush> 
       </Setter.Value> 
      </Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<TextBox Tag="hint text" Style="{StaticResource stlHintbox}" /> 

Vì vậy, những gì bắt? Làm thế nào tôi có thể liên kết với tài sản tổ tiên từ bên trong một phong cách?

Trả lời

12

Vấn đề không phải với RelativeSource nhưng với cách bạn đang sử dụng VisualBrush. Nhớ lại rằng các kiểu được chia sẻ giữa các phần tử bạn áp dụng chúng. Lý do mà ví dụ của bạn không hoạt động là, có hiệu lực bạn đang cố gắng chia sẻ một hộp văn bản duy nhất (cái bạn gắn thẻ "bên trong") với nhiều hộp văn bản gốc.

Để xem tại sao đây là sự cố, hãy thử thử nghiệm ý tưởng: Hộp văn bản bên trong được tạo một lần (nói gần đúng, điều này sẽ xảy ra khi tạo kiểu). Hộp văn bản nào được áp dụng cho nên được chọn làm tổ tiên của hộp văn bản bên trong khi bạn sử dụng liên kết RelativeSource?

Đây là lý do tại sao DataTemplatesControlTemplates tồn tại trong WPF. Thay vì thực sự trực tiếp tạo hình ảnh trực tiếp, chúng xác định mẫu cho phép tạo nhiều bản sao của hình ảnh khi cần.

+0

Ok, điều đó thực sự có ý nghĩa ... Tôi đã chuyển qua sách quá nhanh có vẻ như :) – veljkoz

5

Reativesource không hoạt động như mong đợi. Tốt hơn là tạo hộp văn bản watermark bằng mẫu điều khiển. Nhưng phiên bản của bạn có thể hoạt động:

<Window.Resources> 
    <Style TargetType="TextBox" x:Key="stlHintbox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value=""> 
       <Setter Property="TextBox.Background"> 
        <Setter.Value> 
         <VisualBrush Stretch="None" Visual="{Binding ElementName=hintText}"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <TextBox Tag="hint text" x:Name="myTextBox" Style="{StaticResource stlHintbox}" /> 
    <Border Visibility="Hidden"> 
     <TextBlock x:Name="hintText" Text="{Binding Tag, ElementName=myTextBox}" FontStyle="Italic" Foreground="LightGray" /> 
    </Border> 
</StackPanel> 
+0

Điều này là ổn, nhưng nó ngăn không cho tôi có nhiều hơn một hộp gợi ý trong cùng một cửa sổ và việc sử dụng nó sẽ không rõ ràng. Cảm ơn đề xuất về mẫu kiểm soát, tôi sẽ xem xét kỹ hơn ... – veljkoz

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