我是WPF n0ob,我正在努力選擇合適的控件來獲得我想要的佈局。WPF的新手 - 使用什麼控件/入門?
我想要做的是在屏幕上畫一串正方形(虛擬便利貼)。每張紙幣的尺寸都會相當大(約150像素左右),可能會有數百個這樣的紙幣。我希望整個事情都是可以滾動的,這樣你就可以調整窗口的大小,不管你喜歡什麼,整個事情應該是可縮放的。
我已經做到了這一點,它的工作原理。
但是我所做的似乎是非常錯誤的......
在代碼中,我動態創建便籤後將其添加到巨型畫布中。我手動做數學來確定每個音符的放置位置以及畫布的大小。我在頂部添加了一些標籤,不得不返回並添加'Y偏移量'值來將所有方塊向下推。我實際上生成了三個不同的畫布控件,然後將它們中的每一個添加到ScrollViewer內部的堆棧面板。我添加了一個滾動條,並設置了堆疊面板以在您調整條時進行放大和縮小。
它'工作',但我覺得我真的沒有用它的方式使用WPF。我試圖用網格來實現同樣的事情,但網格似乎不想適當地調整自己的尺寸。
有人能告訴我一個'更好'的方式來實現相同的外觀嗎?
這是我的Xaml代碼 - 如你所見;沒有太多吧....
<Window x:Class="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">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="25" />
<RowDefinition />
</Grid.RowDefinitions>
<Slider x:Name="ZoomSlider" Minimum="0.01" Value="1" Maximum="2" Margin="0,0,0,6" />
<ScrollViewer x:Name="MyScroller" Grid.Row="1" HorizontalScrollBarVisibility="Visible" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
<StackPanel x:Name="TicketsGrid" Background="White" HorizontalAlignment="Center">
</StackPanel>
</ScrollViewer>
</Grid>
然後這裏是我在做什麼的代碼(醜陋!)
For Each myWorkItem As WorkItem In myWorkItems
Dim newRect As New Border
newRect.Width = TicketSizeX
newRect.Height = TicketSizeY
If myWorkItem.State.ToUpper.Contains("HOLD") Then
newRect.Background = New SolidColorBrush(Colors.Purple)
Else
newRect.Background = New SolidColorBrush(Color)
End If
newRect.CornerRadius = New System.Windows.CornerRadius(5)
newRect.BorderThickness = New System.Windows.Thickness(1)
newRect.BorderBrush = New SolidColorBrush(Colors.Black)
Dim myPanel As New StackPanel
newRect.Child = myPanel
Dim lblTitle As New Label
lblTitle.Content = myWorkItem.Id
lblTitle.FontWeight = System.Windows.FontWeights.Bold
Dim lblDesc As New TextBlock
lblDesc.Text = myWorkItem.Title
lblDesc.TextWrapping = TextWrapping.Wrap
myPanel.Children.Add(lblTitle)
myPanel.Children.Add(lblDesc)
newRect.SetValue(Canvas.LeftProperty, CType(((TicketCount Mod TicketsXPerUser) * TicketStepX) + (xOffset * TicketStepX * TicketsXPerUser), Double))
newRect.SetValue(Canvas.TopProperty, CType(((Math.Floor((TicketCount/TicketsXPerUser)) * TicketStepY)) + NameLabelHeight, Double))
myCanvas.Children.Add(newRect)
TicketCount += 1
Next
MyCanvas.Width = (TicketStepX * TicketsXPerUser) * myTFS.SharedCodeTeam.Count
MyCanvas.Height = (CType(((Math.Floor((MaxTicket/TicketsXPerUser)) + 1) * TicketStepY), Double))
TicketsGrid.Children.Add(MyCanvas)
在寫了一模一樣的藥方,我覺得你離開了被提的是,他可以使用通過設置ItemsPanel以及選擇不同佈局的唯一的事情。默認情況下,它是垂直方向的StackPanel,但我認爲他想使用WrapPanel類似的功能。 – 2009-10-13 16:55:45
是的,我敢打賭,你是對的。 +1 – Will 2009-10-13 18:06:11
好,如果不是稍微進攻,福利局介紹到這裏MVVM:http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/432/MVVM-for-Tarded-Folks-Like-Me-or- MVVM和-什麼-IT-手段 - Me.aspx – Will 2009-10-13 18:24:24