2017-02-20 48 views
0

我試圖簡單地定義第二個堆棧面板(根堆棧面板內的兩個)的所有矩形元素的填充,需要的填充爲白色。由於一個stackpanel沒有ItemTemplate,我試着用它替換它,然後用ItemsControl封裝它。當我看到ItemsControl沒有Orientation屬性時,堆棧面板的封裝就變成了。將樣式應用於某個(指定)堆棧面板(或控制)的所有子元素

無論如何,畢竟這個孩子的矩形仍然沒有得到充滿白色...>。 <我在做什麼錯?我還試圖做與事件綁定一樣的事情,就像How to set an event function via a style?我仍然在嘗試那裏的事情,我以爲我想通過ItemControl最初做它,而不是工作,無論是ato:/不是我的一天)

<Window x:Class="RegenboogDragDrop.WindowRegenboog" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="WindowRegenboog" Height="350" Width="525"> 
<Window.Resources> 
    <Style TargetType="{x:Type Rectangle}"> 
     <Setter Property="Height" Value="50"></Setter> 
     <Setter Property="Width" Value="50"></Setter> 
     <Setter Property="Margin" Value="5"></Setter> 
     <Setter Property="Stroke" Value="Black"></Setter> 
     <Setter Property="StrokeThickness" Value="3"></Setter> 
    </Style> 

</Window.Resources> 
    <StackPanel> 
    <StackPanel Margin="0,50" Orientation="Horizontal" HorizontalAlignment="Center"> 
     <Rectangle Fill="Yellow" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Orange" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Red" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Blue" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Green" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Violet" MouseMove="Rectangle_MouseMove"></Rectangle> 
     <Rectangle Fill="Indigo" MouseMove="Rectangle_MouseMove"></Rectangle> 
    </StackPanel> 
    <ItemsControl Name="DropZone" HorizontalAlignment="Center"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <Rectangle Fill="White"/> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 

     <StackPanel Orientation="Horizontal"> 
     <Rectangle Name="dropRed" Fill="White"/> 
     <Rectangle Name="dropOrange" MouseMove="Rectangle_MouseMove" DragDrop.DragEnter="Rectangle_DragEnter" DragDrop.DragLeave="Rectangle_DragLeave" DragDrop.Drop="Rectangle_Drop" AllowDrop="True"></Rectangle> 
     <Rectangle Name="dropYellow" Fill="White" MouseMove="Rectangle_MouseMove" DragDrop.DragEnter="Rectangle_DragEnter" DragDrop.DragLeave="Rectangle_DragLeave" DragDrop.Drop="Rectangle_Drop" AllowDrop="True"></Rectangle> 
     <Rectangle Name="dropGreen"></Rectangle> 
     <Rectangle Name="dropBlue"></Rectangle> 
     <Rectangle Name="dropIndigo"></Rectangle> 
     <Rectangle Name="dropViolet"></Rectangle> 
     </StackPanel> 
    </ItemsControl> 
    <Button Name="ButtonCheck" Content="Check volgorde" Margin="5,50"></Button> 
</StackPanel> 

代碼,如果你想嘗試一下後面:(在第二行的第三方可以接收通過拖放顏色,而第二個擁有所有的事件,但不需要填寫,我試圖讓它有)(DutchVarsTo英語:rechthoek意味着廣場,kleur指顏色,gesleepteKleur意味着draggedColor,睡眠指拖動)

https://defuse.ca/b/c19ncFwllWIpSRe6I0cclp(我想不出如何摺疊C#代碼片段就像JS這裏https://meta.stackexchange.com/questions/70885/collapse-code-snippets-in-answers片段:S左右引擎收錄鏈接到代碼隱藏)

回答

1

聲明默認矩形樣式在StackPanel中的資源:

<StackPanel> 
    <StackPanel.Resources> 
     <Style TargetType="Rectangle"> 
      <Setter Property="Fill" Value="White"/> 
     </Style> 
    </StackPanel.Resources> 

    <Rectangle .../> 
    ... 
</StackPanel> 

如果您有其他默認在T矩形風格高他元素樹,你可以對花柱基部你的「本地默認樣式」是風格的BasedOn財產的手段,像

<StackPanel.Resources> 
    <Style TargetType="Rectangle" BasedOn="{StaticResource {x:Type Rectangle}}"> 
     <Setter Property="Fill" Value="White"/> 
    </Style> 
</StackPanel.Resources> 
+0

一個優雅的解決方案,當我接受一個答案(然後我會有15個代表)時,我有一個優秀的解決方案,但是在這種情況下,我試圖學習如何做一件事(樣式子元素stackpanel),所以它對我來說是個黑客。我們可以想象有第三排盒子需要灰色填充(比方說,做一個反向彩虹)。我想知道如何在沒有黑客入侵的情況下(即,創建一個特殊的矩形子類型或在該範圍內的東西) – DeveloperDoge

+0

不確定你的意思是「黑客」。爲了設計父元素的子元素的樣式,這是方法。否則,你將不得不在某些頂級資源字典中使用'x:Key'創建樣式,並明確地將它們分配給元素的'Style'屬性。 – Clemens

+0

aaaah是的,我剛剛看到你的意思,你在StackPanel.Resources中做的!我如何在這裏使用BasedOn =「...」來融合上述風格。 – DeveloperDoge

1

您可以定義具有Fill屬性的類:

public class Item 
{ 
    public Brush Fill { get; set; } 
} 

ItemsControlItemsSource屬性設置爲此類對象的集合:

public partial class WindowRegenboog : Window 
{ 
    public WindowRegenboog() 
    { 
     InitializeComponent(); 
     DropZone.ItemsSource = new List<Item> { new Item { Fill = Brushes.Red }, new Item() { Fill = Brushes.Yellow } }; 
    } 
} 

然後,您可以綁定在ItemTemplateFill源屬性Rectangle的屬性:

<ItemsControl Name="DropZone" HorizontalAlignment="Center"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <Rectangle Fill="{Binding Fill}" Width="200" Height="200"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

這種方式,你可以通過簡單的源集合中的項目的Fill屬性設置爲不同的畫筆改變Fill顏色Rectangle的。

+0

我欣賞努力和巧妙的綁定+1。不過,爲了他人的利益,我會接受Clemens的最佳實踐解決方案。我不應該涉足ItemTemplates,他們在我的情況下不像預期的那樣工作,即使處理器值存在Visual Studio錯誤也使事情和風格複雜化,似乎是一種更清晰的清晰方法。 – DeveloperDoge

+0

+1?你似乎忘記了投票。無論如何,如果你想能夠分別控制每個Retangle元素的填充,使用隱式樣式將不起作用。在使用XAML中的任何項目集合時,最好使用帶有ItemTemplate和數據綁定的ItemsControl。 – mm8

+0

現在我的大腦(因睡眠不足而疲憊不堪)無法完全理解爲什麼你的方法會更好。據我瞭解,你創建一個自定義窗口類,並以某種方式沒有base/inheriting /只有一個屬性的項目類,然後你做'DropZone.ItemsSource =新列表 {新項目{Fill = Brushes.Red},新項目(){Fill = Brushes.Yellow}};'(顏色可能會稍後變成動態的),我不完全明白。在我卑微的經歷中,我猜想其他一些開發者不會這樣做,迫使我去編寫非KISS的危險的後核爆發荒地。 – DeveloperDoge

相關問題