2012-07-04 63 views
0

在WPF中是否有像HTML div這樣的容器(這很容易),我可以在那裏定位容器中的所有文本塊?所以我不必在每個文本塊上指定樣式有沒有一個容器,我可以針對多種元素的樣式

我有一個複雜的畫布,只在一個地區,我想定位文本塊。所以,如果我嘗試格在畫布座標被忽略

  <StackPanel> 
      <StackPanel.Resources> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="Foreground" Value="White"></Setter> 
        <Setter Property="FontFamily" Value="Arial"></Setter> 
       </Style> 
      </StackPanel.Resources> 

      <TextBlock Canvas.Left="87" Canvas.Top="210"> 
      mytext1 
      </TextBlock> 
      <TextBlock Canvas.Left="87" Canvas.Top="232"> 
      mytext2 
      </TextBlock> 
      <TextBlock Canvas.Left="87" Canvas.Top="254"> 
      mytext2 
      </TextBlock> 
     </StackPanel> 

和我的文本塊出現在:

東西到這樣的效果(這裏不是StackPanel的其他東西,將工作作爲一種風格定位容器)畫布頂部。

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
<Canvas Width="500" Height="500"> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="TextBlock"> 
       <Setter Property="Foreground" Value="Red"></Setter> 
      </Style> 
     </Grid.Resources> 
    <TextBlock Text="MyTextBlock1" Canvas.Left="300" Canvas.Top="300"> 
    </TextBlock> 
    </Grid> 
</Canvas> 

+0

你是指除了只使用網格? – jimmyjambles

+0

目前還不清楚爲什麼你不能做你在第一個例子中所做的事情。至於使用'Grid'的問題,您需要將'Canvas'附加屬性移動到'Grid'而不是'TextBlock'上,因爲'Canvas'只會在其中查找這些屬性直接的孩子。 –

+0

你能提供一些關於你想要達到的內容的更多信息嗎?通常我會使用一個'StyleSelector'來達到這個目的,但是目前還沒有辦法告訴哪個TextBlocks應用這個樣式而沒有設置附加屬性(所以你可以直接應用樣式EG Style = {StaticResource myStyle}) 。我有一種感覺'ItemsControl'在這裏很有用,但需要更多地瞭解你的需求。此外,您所需佈局的圖表會很好。 –

回答

0

在正在使用的帆布這種情況下的座標,得到在左側87和間隔元件的頂部之間的間距22。 StackPanel已經陸續佈置了這些項目。你只需要設置頁邊距爲您的TextBlocks

<StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Foreground" Value="Red"></Setter> 
       <Setter Property="FontFamily" Value="Arial"></Setter> 
       <Setter Property="FontSize" Value="14" /> 
       <Setter Property="Margin" Value="87,4, 0, 4" /> 
      </Style> 
     </StackPanel.Resources> 
     <TextBlock>mytext1</TextBlock> 
     <TextBlock>mytext2</TextBlock> 
     <TextBlock>mytext3</TextBlock> 
    </StackPanel> 

要回答你的問題,無論你想要隔離參考資料部分,您可以使用網格控制(或帆布或任何其他元素)。網格不執行任何佈局。

<StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="{x:Type TextBlock}"> 
       <Setter Property="Foreground" Value="White"></Setter> 
       <Setter Property="FontFamily" Value="Arial"></Setter> 
      </Style> 
     </StackPanel.Resources> 

     <TextBlock> 
      mytext1 
     </TextBlock> 
     <Canvas> 
      <Canvas.Resources> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="Foreground" Value="Red"></Setter> 
        <Setter Property="FontFamily" Value="Times"></Setter> 
       </Style> 
      </Canvas.Resources> 
      <TextBlock Canvas.Left="87" Canvas.Top="210">mytext2</TextBlock> 
      <TextBlock Canvas.Left="87" Canvas.Top="232">mytext2</TextBlock> 
     </Canvas> 
    </StackPanel> 
+0

謝謝。但在上面的網格上看到我的筆記。 – tim

+0

我試過了你的代碼,並且StackPanel中的Canvas座標也被忽略了,你只是碰巧寫了一個座標來完全像堆棧面板一樣繪製畫布。如果你想要做的只是在它們之間插入一堆文本框,並在它們之間插入22個點,你可以使用上面添加的編輯代碼,如果你堅持手動定位你的元素,這在xaml中是非常不規範的,你可以使用一個畫布元素,而不是我推薦的網格 – jimmyjambles

+0

是的,意識到這一切。我使用的例子只是示範。 – tim

相關問題