我在一个PANEL中自动生成了多个控件,但是每个控件的坐标是不确定的,需要先判断一个区域中是否有控件,如果没有,就创建在这个地方。请问有什么好的方法吗?

解决方案 »

  1.   

    创建一个单独的布局类(Layout),Layout只需要知道容器范围(Panel),每添加一个新子控件由布局控件统一安排位置。
      

  2.   

    可能我没讲问题阐述清楚;
    补充,因为我做的是个图标,采用LANEL中添加其他控件来表示,例如公司的架构图,控件之间犹豫其关系会产生连线,并且在Lanel中的控件一部分时不能拖动,另外一部分时可以拖动的(根据数据库生成).当双击某个不动的控件时,生成其有关系的其他控件,并产生连接线.
    我的问题就在这里,当我双击控件时,生成新的控件到Lanel中,这个时候我希望判断,生成的位置不会挡住已经有的控件.所以希望判断区域中是否有控件.我的解决思路是;
    犹豫区域是矩形,需要对照的控件也是矩形.
    第一步,判断控件的四个点位是否在区域内(每个点位X,Y),用;
    Rectangle myTabRect = new Rectangle(25, 6, 20, 20);
                        bool isClose = x > myTabRect.X
                        && x < myTabRect.Right
                        && y > myTabRect.Y
                        && y < myTabRect.Bottom;
    的方法.
    第二步,如果控件大于区域大小时,就还需要判断区域外的8个单位了.
    对称的单位中如果都为真的话,就说明,区域在控件的中间,就FALSE了.我觉得这样很复杂,想了解是否有简单的方法.
      

  3.   


    建议使用 wpf + treeview + 数据绑定 只需要重写 style 就能搞定了
      

  4.   


    你用 wpf 试过? 怎么可能慢呢? 我的还带动画呢 也没感觉慢啊
      

  5.   

    不好意思,我理解错了.你能细讲一下WPF的方法呢?
      

  6.   

    1、先搞个自关联的表 id, parent_id 的那种在程序里添加 LINQ to SQL 类 (DataContext) 关联属性 Parent / Children2、给 TreeView 设置 DataTemplate
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
            <ItemsControl ItemsSource="{Binding Path=Name}">
                <ItemsControl.Style>
                    <Style TargetType="{x:Type ItemsControl}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ItemsControl}">
                                    <Grid>
                                        <ItemsPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ItemsControl.Style>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="block" RenderTransformOrigin="0.5,0.5" Text="{Binding}" TextAlignment="Center"/>
                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding}" Value="(">
                                <Setter TargetName="block" Property="RenderTransform">
                                    <Setter.Value>
                                        <RotateTransform Angle="90"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding}" Value=")">
                                <Setter TargetName="block" Property="RenderTransform">
                                    <Setter.Value>
                                        <RotateTransform Angle="90"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding}" Value="-">
                                <Setter TargetName="block" Property="RenderTransform">
                                    <Setter.Value>
                                        <RotateTransform Angle="90"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
    3、设置 TreeView 的样式 Style<TreeView.Style>
        <Style TargetType="{x:Type TreeView}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush" Value="#FFB0C4DE"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="Foreground" Value="#FF042271"/>
            <Setter Property="Padding" Value="15,20"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TreeView}">
                        <Grid>
                            <Rectangle x:Name="Rt" Opacity="0" Fill="#40000000">
                                <Rectangle.Effect>
                                    <BlurEffect/>
                                </Rectangle.Effect>
                            </Rectangle>
                            <Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="true">
                                <ScrollViewer x:Name="Scroll" Padding="-20,0,0,0">
                                    <WrapPanel x:Name="ItemsHost" IsItemsHost="True" Margin="{TemplateBinding Padding}" Orientation="Horizontal"/>
                                </ScrollViewer>
                            </Border>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsGrouping" Value="true">
                                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="Rt" Storyboard.TargetProperty="Opacity" Duration="0:0:0.5" To="1"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="Rt" Storyboard.TargetProperty="Opacity" Duration="0:0:0.5" To="0"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.ExitActions>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                <Setter TargetName="Bd" Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}"/>
                            </Trigger>
                            <EventTrigger RoutedEvent="Loaded">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ThicknessAnimation Storyboard.TargetName="Scroll" Storyboard.TargetProperty="Padding" DecelerationRatio="0.9" Duration="0:0:3" To="0"/>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.Style>
      

  7.   

    4、设置 ItemContainerStyle<TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush" Value="#FF336699"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource TreeViewItemFocusVisual}"/>
            <Setter Property="IsExpanded" Value="False"/>
            <Setter Property="Margin" Value="5,0"/>
            <Setter Property="Padding" Value="10"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment,RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
      

  8.   

    贴不下了,汗!        <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TreeViewItem}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid Grid.Row="0" HorizontalAlignment="Center">
                                <Rectangle x:Name="el_Shadow" Fill="#30000000">
                                    <Rectangle.Effect>
                                        <BlurEffect />
                                    </Rectangle.Effect>
                                </Rectangle>
                                <Rectangle Fill="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
                                <Border x:Name="el_Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" HorizontalAlignment="Center" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}">
                                    <ContentPresenter x:Name="PART_Header" Grid.Row="0" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                </Border>
                            </Grid>
                            <Grid x:Name="el_Arrow" Grid.Row="1" Height="15">
                                <Path Data="M 1,1.5 L 4.5,5 L 8,1.5" Stroke="{TemplateBinding BorderBrush}" StrokeThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center" SnapsToDevicePixels="false"/>
                            </Grid>
                            <Rectangle x:Name="el_Line" Grid.Row="1" Fill="{TemplateBinding BorderBrush}" Width="1" Height="0" Opacity="0" SnapsToDevicePixels="True"/>
                            <Border x:Name="el_Range" Grid.Row="2" Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Height="0" Opacity="0" SnapsToDevicePixels="True"/>
                            <WrapPanel x:Name="el_Host" Grid.Row="3" IsItemsHost="True" Orientation="Horizontal" Visibility="Collapsed"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="HasItems" Value="true"/>
                                    <Condition Property="IsExpanded" Value="true"/>
                                </MultiTrigger.Conditions>
                                <Setter TargetName="el_Host" Property="Visibility" Value="Visible"/>
                                <MultiTrigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="el_Line" Storyboard.TargetProperty="Height" To="15" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Line" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Range" Storyboard.TargetProperty="Height" To="15" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Range" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Arrow" Storyboard.TargetProperty="Height" To="0" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Arrow" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </MultiTrigger.EnterActions>
                                <MultiTrigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="el_Line" Storyboard.TargetProperty="Height" To="0" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Line" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Range" Storyboard.TargetProperty="Height" To="0" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Range" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Arrow" Storyboard.TargetProperty="Height" To="15" Duration="0:0:0.2"/>
                                            <DoubleAnimation Storyboard.TargetName="el_Arrow" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </MultiTrigger.ExitActions>
                            </MultiTrigger>
                            <Trigger Property="IsExpanded" Value="true">
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="el_Host" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <DoubleAnimation Storyboard.TargetName="el_Host" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.ExitActions>
                            </Trigger>
                            <Trigger SourceName="el_Host" Property="Opacity" Value="0">
                                <Setter TargetName="el_Host" Property="Visibility" Value="Collapsed"/>
                            </Trigger>
                            <Trigger Property="HasItems" Value="false">
                                <Setter TargetName="el_Host" Property="Visibility" Value="Collapsed"/>
                                <Setter TargetName="el_Arrow" Property="Visibility" Value="Collapsed"/>
                            </Trigger>
                            <DataTrigger Binding="{Binding ElementName=el_Host, Path=Children.Count}" Value="1">
                                <Setter TargetName="el_Range" Property="Visibility" Value="Collapsed"/>
                            </DataTrigger>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="el_Border" Property="Background" Value="#FFC5D9F1"/>
                                <Trigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="el_Shadow" Storyboard.TargetProperty="Fill.Color" To="#AB000000" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="el_Shadow" Storyboard.TargetProperty="Fill.Color" To="#30000000" Duration="0:0:0.2"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </Trigger.ExitActions>
                            </Trigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelected" Value="true"/>
                                    <Condition Property="IsSelectionActive" Value="false"/>
                                </MultiTrigger.Conditions>
                                <Setter TargetName="el_Border" Property="Background" Value="#FFDDD9C3"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.ItemContainerStyle>
      

  9.   

    查看当前control的controls.count,如果为0,当前的control.controls.add(控件)
      

  10.   


    谢谢您贴了这么多代码,您的思路是用XML记录每个控件的位置,并用进行比对是吗?
    呵呵,因为太多,我确实有点马虎的看了看.其实这个问题,我已经解决了,虽然有点笨重,但还是完成了工作.第一步,虚拟一个备选择的区域,并将这个区域的X,Y,Width,heght定义了一个Point来记录.(当然工作还是比较多了).并将目标区域作为九宫格中的5区.
    123
    456
    789
    如果在第5区,返回值为有控件,我就再虚拟一个备选区域.第二步,循环Panel中的所有控件,循环时进行判断.判断的方法是;将控件的四个点一一与虚拟的九宫格区域进行比较,也就是第一步准备好的Point衍生出来的.如果在5区,当然就不用多说,就是换区域了.如果四个点都不在5区,同时控件的width和heght都小于虚拟区域,那这个区域就有效.
    如果控件大于虚拟区域的width和heght,就需要对,(1,3),(2,8),(3,9),(4,6),(7,9),(1,7)等区域同时两个点时还是返回fales.确实有点麻烦,而且我在调试上花了很多时间,但终于成功了.