2011-02-02 22 views
14

Nếu người trả lời this question là đúng, bạn không thể đặt một ràng buộc như giá trị trong một setter trong một phong cách trong Silverlight. Đó là một sự xấu hổ, bởi vì tôi có 4 textblocks mà tất cả sử dụng cùng một ràng buộc chính xác cho tài sản Opacity của họ. Có anyway để trong một cảm giác "phong cách" tài sản Opacity của họ để tất cả bốn người trong số họ trỏ đến cùng một ràng buộc? Nếu không, tôi phải đặt từng thuộc tính Opacity riêng lẻ. Trong trường hợp của tôi thậm chí còn tồi tệ hơn - tất cả bốn chia sẻ ràng buộc tài sản khác là tốt, có nghĩa là mỗi khai báo TextBlock là khá dài, và tất cả chúng đều giống nhau (liên kết thuộc tính của chúng). Tôi biết tôi có thể đặt chính xác tất cả các ràng buộc tài sản được chia sẻ của họ trong mã sau, nhưng tôi muốn một giải pháp XAML nếu có.Silverlight: Làm thế nào để sử dụng một ràng buộc trong setter cho một phong cách (hoặc một công việc tương đương xung quanh)

Cảm ơn!

+1

Bạn có thể áp dụng ràng buộc trong thiết lập kiểu trong WPF vì vậy bạn chỉ hỏi về Silverlight? – baalazamon

+0

Ah, tôi không nhận ra điều đó. Tôi đã chỉnh sửa câu hỏi của mình để nói cụ thể về Silverlight. – JoeCool

Trả lời

11

Dưới đây là cách thực hiện. Bạn sử dụng một ContentControl và chỉ định một ControlTemplate cho nó như là một nguồn tài nguyên tĩnh: -

<Grid.Resources> 
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl"> 
     <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" /> 
    </ControlTemplate> 
<Grid.Resource> 
<ContentControl Content="{Binding SomeTextValue}" Template="{StaticResource CommonTextBlock}" /> 
<ContentControl Content="{Binding SomeOtherTextValue}" Template="{StaticResource CommonTextBlock}" /> 

Bây giờ bạn có thể bung như thể các tài sản khác với cam kết ràng buộc vào Template kiểm soát như bạn muốn.

Cách tiếp cận này có thể được mở rộng để Style: -

<Grid.Resources> 
    <ControlTemplate x:Key="CommonTextBlock" TargetType="ContentControl"> 
     <TextBlock Opacity="{Binding SomeOpacity}" Text="{TemplateBinding Content}" /> 
    </ControlTemplate> 
    <Style x:Key="CommonTextBlockStyle" TargetType="ContentControl"> 
     <Setter Property="Template" Value="{StaticResource CommonTextBlock}" /> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style> 
<Grid.Resource> 
<ContentControl Content="{Binding SomeTextValue}" Style="{StaticResource CommonTextBlockStyle}" /> 
<ContentControl Content="{Binding SomeOtherTextValue}" Style="{StaticResource CommonTextBlockStyle}" /> 
+0

Tôi thích ý tưởng đằng sau điều này, nhưng có vẻ như TextBlock không có thuộc tính Mẫu. Có điều gì tôi đang làm sai? – JoeCool

+0

Đó là một giải pháp khá gọn gàng mà bạn có. –

+0

@JoeCool: Xin lỗi những phần tử 'TextBlock' này sẽ là các điều khiển nội dung. Đã chỉnh sửa cho phù hợp. (Tôi biết tôi nên cắt giảm 'không được phép' thay vì nhập lại mã). – AnthonyWJones

1

Trong Silverlight: Vâng ... vâng, bạn không thể thực hiện một ràng buộc. Ở đây tôi đã sử dụng một tài nguyên tĩnh, (có thể sẽ không đáp ứng nhu cầu của bạn). Đây là gần nhất bạn sẽ nhận được mà không cần thực hiện các ràng buộc trong mã.

<UserControl x:Class="SilverlightApplication1.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:system="clr-namespace:System;assembly=mscorlib" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400" 
    Name="this" Tag="0.5"> 

    <UserControl.Resources> 
    <system:Double x:Key="opacity">0.5</system:Double> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Opacity" Value="{StaticResource opacity}"/> 
    </Style> 
    </UserControl.Resources> 
    <StackPanel> 
    <TextBlock Text="ABC"/> 
    <TextBlock Text="DEF"/> 
    <TextBlock Text="GHI"/> 
    <TextBlock Text="JKL"/> 
    </StackPanel> 
</UserControl> 

EDIT: Vâng, ở đây nó là trong WPF anyway ...

Ở đây bạn đi, trong WPF:

<Window x:Class="WpfApplication8.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     Name="MyWindow" Tag="0.5"> 
    <Window.Resources> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Opacity" Value="{Binding ElementName=MyWindow, Path=Tag}"/> 
    </Style> 
    </Window.Resources> 
    <StackPanel> 
    <TextBlock Text="ABC"/> 
    <TextBlock Text="DEF"/> 
    <TextBlock Text="GHI"/> 
    <TextBlock Text="JKL"/> 
    </StackPanel> 
</Window> 

Tất nhiên bạn có thể nhận được rất nhiều sáng tạo hơn thế này . Ngoài ra, tùy thuộc vào cách thức/khi nào/nơi mà phong cách của bạn được xác định, đôi khi nó dễ dàng hơn chỉ để làm điều đó trong mã.

2

Kiểm tra SetterValueBindingHelper trong số này blog article và hỗ trợ cho Binding trong bộ định kiểu kiểu là announced for SL5.

+0

Thật không may điều này vẫn là một "thêm mã để giải quyết vấn đề" loại giải pháp. – AnthonyWJones

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