关于区域内控件技术的问题 我在一个PANEL中自动生成了多个控件,但是每个控件的坐标是不确定的,需要先判断一个区域中是否有控件,如果没有,就创建在这个地方。请问有什么好的方法吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 创建一个单独的布局类(Layout),Layout只需要知道容器范围(Panel),每添加一个新子控件由布局控件统一安排位置。 可能我没讲问题阐述清楚;补充,因为我做的是个图标,采用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了.我觉得这样很复杂,想了解是否有简单的方法. 建议使用 wpf + treeview + 数据绑定 只需要重写 style 就能搞定了 你用 wpf 试过? 怎么可能慢呢? 我的还带动画呢 也没感觉慢啊 不好意思,我理解错了.你能细讲一下WPF的方法呢? 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> 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}}}"/> 贴不下了,汗! <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> 查看当前control的controls.count,如果为0,当前的control.controls.add(控件) 谢谢您贴了这么多代码,您的思路是用XML记录每个控件的位置,并用进行比对是吗?呵呵,因为太多,我确实有点马虎的看了看.其实这个问题,我已经解决了,虽然有点笨重,但还是完成了工作.第一步,虚拟一个备选择的区域,并将这个区域的X,Y,Width,heght定义了一个Point来记录.(当然工作还是比较多了).并将目标区域作为九宫格中的5区.123456789如果在第5区,返回值为有控件,我就再虚拟一个备选区域.第二步,循环Panel中的所有控件,循环时进行判断.判断的方法是;将控件的四个点一一与虚拟的九宫格区域进行比较,也就是第一步准备好的Point衍生出来的.如果在5区,当然就不用多说,就是换区域了.如果四个点都不在5区,同时控件的width和heght都小于虚拟区域,那这个区域就有效.如果控件大于虚拟区域的width和heght,就需要对,(1,3),(2,8),(3,9),(4,6),(7,9),(1,7)等区域同时两个点时还是返回fales.确实有点麻烦,而且我在调试上花了很多时间,但终于成功了. sql in c#的winform可以直接调用js函数,得到结果吗? NetworkStream.Dispose()后,不能再重新实例化? C#如何调用站长之家工具 请问,这个tcp传输的简单例子,为什么不能双向的交流信息? 最近关于手机短信,收到后只能抠电池的这事 菜鸟的问题 怎样写像Sql 中的newid()一样的随机但可以做主键的函数? c# form窗体 做一个摄像头(kinect) 自定义控件:如何加这么个属性 .Net "??"是什么语法啊? 进度条问题,求各位同仁大侠帮忙。。。
补充,因为我做的是个图标,采用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了.我觉得这样很复杂,想了解是否有简单的方法.
建议使用 wpf + treeview + 数据绑定 只需要重写 style 就能搞定了
你用 wpf 试过? 怎么可能慢呢? 我的还带动画呢 也没感觉慢啊
<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>
<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}}}"/>
<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>
谢谢您贴了这么多代码,您的思路是用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.确实有点麻烦,而且我在调试上花了很多时间,但终于成功了.