2014-01-24 164 views
2

在我的Windows窗體應用程序中託管一個WPF複合控件作爲空調系統的內部顯示。在該圖中,每個氣體管道和流體管道由路徑控制表示。我們希望這些Path對象的顏色(使用Path.Fill)表示壓力警報狀態,例如低警報,中警報或高警報。代碼如何擴展WPF路徑控件

部分,我們已經被列爲:

<local:UC_Line_1 Margin="27.728,16.486,39.219,36.308" DataContext="{Binding Pipe1Alert}"/> 
<local:UC_Line_2 Margin="21.172,15.322,33.218,6.876" DataContext="{Binding Pipe2Alert}"/> 
<local:UC_Line_3 Margin="46.907,0,31.36,26.178" DataContext="{Binding Pipe3Alert}"/> 
<local:UC_Line_4 Margin="0,11.939,20.842,13.835" DataContext="{Binding Pipe4Alert}"/> 

每個UC_Line_x控制有類似這樣的代碼:

<UserControl 
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:enum="clr-namespace:KPRC.App.AC.Enums" 
x:Class="KPRC.App.AC.UC_Line_2" 
x:Name="Line_2"> 
<UserControl.Resources> 
    <!-- Colors --> 
    <!--Red Fill Color--> 
    <SolidColorBrush x:Key="RedFill" Color="Red"/> 
    <!--Yellow Fill Color--> 
    <SolidColorBrush x:Key="YellowFill" Color="Yellow"/> 
    <!--Orange Fill Color--> 
    <SolidColorBrush x:Key="OrangeFill" Color="Orange"/> 
</UserControl.Resources> 

<Grid x:Name="UC_Line_2_LayoutRoot"> 
    <Path x:Name="FL_2" Stretch="Fill" Data="M20.167,0 L24.167,0 24.167,28.924 44,28.924 44,32.924 24.167,32.924 20.167,32.924 0,32.924 0,28.924 20.167,28.924 z"> 
     <Path.Style> 
      <Style> 
       <Style.Triggers> 
        <!-- High Alert --> 
        <DataTrigger Binding="{Binding AlertState}"> 
         <DataTrigger.Value> 
          <enum:AlertState>High</enum:AlertState> 
         </DataTrigger.Value> 
         <Setter Property="Path.Fill" Value="{StaticResource RedFill}"/> 
        </DataTrigger> 
        <!-- Medium Alert --> 
        <DataTrigger Binding="{Binding AlertState}"> 
         <DataTrigger.Value> 
          <enum:AlertState>Medium</enum:AlertState> 
         </DataTrigger.Value> 
         <Setter Property="Path.Fill" Value="{StaticResource OrangeFill}"/> 
        </DataTrigger> 
        <!-- Low Alert --> 
        <DataTrigger Binding="{Binding AlertState}"> 
         <DataTrigger.Value> 
          <enum:AlertState>Low</enum:AlertState> 
         </DataTrigger.Value> 
         <Setter Property="Path.Fill" Value="{StaticResource YellowFill}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Path.Style> 
    </Path> 
</Grid> 

每個UC_Line_x控制具有除了幾乎完全一樣的代碼路徑幾何上的差異。 我明白這是一個巨大的代碼重複。

我正在考慮替代方法來支持相同的結果。由於每個管道僅在路徑幾何中有所不同,是否有可能在基於System.Windows.Form.Path的控制下具有額外的「AlertState」屬性,以在合成UI中具有以下代碼:

<local:UC_Line_Path AlertState="{Binding Pipe1Alert.AlertState}" Data="M20.167,0 L24.167,0 24.167,28.924 44,28.924 44,32.924 24.167,32.924 20.167z"/> 
<local:UC_Line_Path AlertState="{Binding Pipe2Alert.AlertState}" Data="M20.167,0 L24.167,0 24.167,28.924 44,28.924 44,32.924 28.924 z"/> 
<local:UC_Line_Path AlertState="{Binding Pipe3Alert.AlertState}" Data="M20.167,0 L24.167,0 24.167,28.924 44,28.924 44,32.924 24.167,32.924 20.167,32.924 0,32.924 0,28.924 z"/> 
<local:UC_Line_Path AlertState="{Binding Pipe4Alert.AlertState}" Data="M20.167,0 L24.167,0 24.167,28.924 20.167,32.924 0,32.924 0,28.924 20.167,28.924 z"/> 

這種方法的問題是 1.路徑是一個密封的類。 WPF不允許我將其擴展。 2.即使假設我可以從Path控件擴展,如何添加一個新的屬性「AlertState」以與原始UC_Line_1代碼中顯示的數據觸發器一起使用?

感謝和問候。

回答

1

有一個簡單的解決方案。使用單個控件UC_Line,併爲其添加屬性PathData。然後你可以從控制範圍內綁定到該屬性:

<Path x:Name="FL_2" Stretch="Fill" 
    Data="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=PathData}"> 

然後用實例提供PathData:

<local:UC_Line Margin="27.728,16.486,39.219,36.308" 
       DataContext="{Binding Pipe1Alert}" 
       PathData="M20.167,0 L24.167,0 24.167,28.924 44,28.924 44,32.924 24.167,32.924 20.167,32.924 0,32.924 0,28.924 20.167,28.924 z" 
/> 

注意,酒店應Geometrydependency property

public class UC_Line : UserControl 
{ 
    public static readonly DependencyProperty PathDataProperty = 
     DependencyProperty.Register("PathData", typeof(Geometry), typeof(UC_Line), null); 
    public Geometry PathData 
    { 
     get { return (Geometry)GetValue(PathDataProperty); } 
     set { SetValue(PathDataProperty, value); } 
    } 

    // ... etc 
} 
+0

謝謝McGarnagle,您提供的解決方案提供了使用PathData用於我的目的的能力。 – aDisplayName