动态添加silverlight / wpf userControl时避免剪切

时间:2012-01-13 01:15:35

标签: c# wpf silverlight xaml

我正在开发一个UserControl,它包含一个带有标题和项目列表的块(ItemsControl)。问题是当我动态地将用户控件添加到画布时,用户控件内容被剪掉,如下所示。我没有在内部为usercontrol设置大小。可以做些什么来避免这种情况。

即使我将usercontrol拖放到画布上,也会发生剪辑。我需要将内容缩放。

<UserControl x:Class="MyTools.MyControl"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       DataContext="{Binding RelativeSource={RelativeSource Self}}">    
    <Grid x:Name="LayoutRoot" Background="White">
        <Border Name="MainBorder" CornerRadius="5" BorderThickness="2" BorderBrush="Black">
        <Grid  Name="grid1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" >
           <Grid.RowDefinitions>
                <RowDefinition Height="34" />
                <RowDefinition Height="*" />
           </Grid.RowDefinitions>
           <Grid Name="titleGrid" Grid.Row="0" Background="#FF727272">
              <TextBlock Name="titleText" HorizontalAlignment="Center" Text="{Binding ControlName}" VerticalAlignment="Center" FontSize="13" FontWeight="Bold" Foreground="Beige" />
            </Grid>
           <Grid Name="gridpr" Grid.Row="1" Background="#12C48F35">
           <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Border Name="borderPr"  CornerRadius="3" Margin="10"  BorderThickness="1" BorderBrush="LightGray" Grid.Row="0">
                <Grid Name="gridPr" Background="#FFC1C1C1" MouseLeftButtonUp="gridPr_MouseLeftButtonUp">
                    <StackPanel>
                        <TextBlock  HorizontalAlignment="Center" Name="txtPr" Text="SubItems" VerticalAlignment="Center" Foreground="#FF584848" FontSize="12" />
                        <ItemsControl x:Name="pitems" ItemsSource="{Binding MyItems}" >
                            <ItemsControl.ItemTemplate>
                            <DataTemplate>
                            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="15,0,0,0">
                                <TextBlock Text="{Binding MyVal}" />
                            </StackPanel>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </Grid>
            </Border>
        </Grid>
        </Grid>
        </Border>
    </Grid>
 </UserControl> 

UserControl的代码隐藏:

namespace MyTools
{
    public partial class MyControl : UserControl
    {
        public MyControl()
        {
            InitializeComponent();
        }

        public string ControlName { get; set; } 
        public object MyItems { get; set; }

        public class Row
        {
            public string MyVal { get; set; }                  
        }

        protected override Size MeasureOverride(Size availableSize)
        {
            var desiredSize = base.MeasureOverride(availableSize);
            var sideLength = Math.Min(desiredSize.Width, desiredSize.Height);

            desiredSize.Width = sideLength;
            desiredSize.Height = sideLength;

            return desiredSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            var sideLength = Math.Min(this.DesiredSize.Width, this.DesiredSize.Height);
            return base.ArrangeOverride(new Size(sideLength, sideLength));
        } 

        private void gridPr_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            pitems.Visibility = pitems.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; 
        }
    }
}

主机客户端代码:

namespace TestProject
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            MyControl control1 = new MyControl();            
            control1.ControlName = "Test Name";

            var test = new List<MyControl.Row>(
              new MyControl.Row[] 
                { 
                    new MyControl.Row {MyVal = "Item1"}, 
                    new MyControl.Row {MyVal = "Item2"}, 
                    new MyControl.Row {MyVal = "Item3"}
                });

            control1.MyItems = test;

             control1.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
             MessageBox.Show(control1.DesiredSize.Height.ToString());

            canvas1.Children.Add(control1);
        }
    }
}

主持人布局:

<UserControl x:Class="TestProject.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="503" d:DesignWidth="758" xmlns:my="clr-namespace:MyTools">
    <Grid x:Name="LayoutRoot" Background="White" Height="507" Width="757">
        <Canvas Height="503" Name="canvas1" HorizontalAlignment="Left" Margin="-1,-1,0,0" VerticalAlignment="Top" Width="758">               
        </Canvas>
    </Grid>
</UserControl>

编辑: 原来这个问题是因为MeasureOverride。当我删除它时,剪辑不存在。感谢您的建议。

0 个答案:

没有答案
相关问题