WPF新手-使用什么控件/入门?

WPF新手-使用什么控件/入门?,wpf,wpf-controls,Wpf,Wpf Controls,我是WPF n0ob,我正在努力选择合适的控件来获得我想要的布局 我想做的是在屏幕上画一堆正方形虚拟便笺。每个音符都会有一个相当大的尺寸,大约150像素,可能有数百个这样的音符。我希望整个事情是可滚动的,这样你就可以调整窗口大小,无论你喜欢什么,整个事情应该是可缩放的 我已经做过了,而且很有效。 但我所做的似乎大错特错 在代码中,我动态创建post-it便笺,并将它们添加到一个巨大的画布中。我正在手动计算,以确定每个音符的放置位置以及画布的大小。我在顶部添加了一些标签,必须返回并添加一个“Y偏移

我是WPF n0ob,我正在努力选择合适的控件来获得我想要的布局

我想做的是在屏幕上画一堆正方形虚拟便笺。每个音符都会有一个相当大的尺寸,大约150像素,可能有数百个这样的音符。我希望整个事情是可滚动的,这样你就可以调整窗口大小,无论你喜欢什么,整个事情应该是可缩放的

我已经做过了,而且很有效。 但我所做的似乎大错特错

在代码中,我动态创建post-it便笺,并将它们添加到一个巨大的画布中。我正在手动计算,以确定每个音符的放置位置以及画布的大小。我在顶部添加了一些标签,必须返回并添加一个“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>            
具有内部的滚动查看器。 将ItemsControl的ItemsSource属性绑定到ObservableCollection,其中POSIT是一个普通的旧CLR对象,包含post上的所有信息。 将DataTemplate添加到ItemsControl的ItemsTemplate属性 将控件添加到DataTemplate,并将它们直接绑定到PostIt的实例 将POSIT实例添加到代码中的ObservableCollection。 ScrollViewer处理所有滚动。这就是你所需要的

设计用于绑定集合。对于集合中的每个实例,它确定要使用的DataTemplate,创建模板的副本,将根的DataContext设置为从集合中提取的实例,并将模板添加到自身。它为集合中找到的每个实例执行此操作

在codebehind中,您只需创建一堆帖子并将它们添加到集合中。没有像你这样糟糕的UI元素构造。呃

如果您能够理解这个概念,那么您就离理解WPF中的模型-视图-控制器模式还有一步之遥。读一下,试试看。这是一种非常简单的方法,可以用复杂的UI创建非常复杂的应用程序,但只需最少的代码,而不需要你目前正在做的那些废话

具有内部的滚动查看器。 将ItemsControl的ItemsSource属性绑定到ObservableCollection,其中POSIT是一个普通的旧CLR对象,包含post上的所有信息。 将DataTemplate添加到ItemsControl的ItemsTemplate属性 将控件添加到DataTemplate,并将它们直接绑定到PostIt的实例 将POSIT实例添加到代码中的ObservableCollection。 ScrollViewer处理所有滚动。这就是你所需要的

设计用于绑定集合。对于集合中的每个实例,它确定要使用的DataTemplate,创建模板的副本,将根的DataContext设置为从集合中提取的实例,并将模板添加到自身。它为集合中找到的每个实例执行此操作

在codebehind中,您只需创建一堆帖子并将它们添加到集合中。没有像你这样糟糕的UI元素构造。呃


如果您能够理解这个概念,那么您就离理解WPF中的模型-视图-控制器模式还有一步之遥。读一下,试试看。这是一种非常简单的方法,可以用复杂的用户界面制作非常复杂的应用程序,但只需最少的代码,而且没有你目前正在做的那些废话。

写的是完全相同的处方,我想你唯一遗漏的是,他可以通过设置ItemsPanel来选择不同的布局。默认情况下,它是垂直方向的StackPanel,但我认为他希望有类似WrapPanel的功能。很好,如果不是有点冒犯的话,这里的MVVM新手介绍:写的是完全相同的处方,我想你只遗漏了一件事,那就是他可以通过设置ItemsPanel来选择不同的布局。默认情况下,它是垂直方向的StackPanel,但我认为他想拥有类似WrapPanel的功能。很好,如果不是有点冒犯的话,这里是MVVM的新手介绍:
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)