【问题标题】:How to change ListboxItem Size with respect to Slider value如何根据 Slider 值更改 ListboxItem 大小
【发布时间】:2013-07-10 11:58:21
【问题描述】:

我有两个用户控件,分别是 “Usercntrl1”“Usercntrl2”,“Usercntrl1”包含 Slider,“Usercntr2”包含 带图像的列表框,现在当我更改“Usercntrl1”中的 滑块值 时,ListboxItems 的大小(即)宽度和高度 必须随 Respect 更改为滑块值。 当它们都出现在同一个用户控件中时,可以轻松完成,如下所示

<ListBox.ItemContainerStyle>
                    <Style TargetType="{x:Type ListBoxItem}">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                        <Setter Property="Padding" Value="0"/>
                        <Setter Property="Margin" Value="1"/>
                        <Setter Property="BorderBrush" Value="Green"/>
                        <Setter Property="Width" Value="{Binding Path=Value, ElementName=sizeSlider, Mode=TwoWay}"/>
                        <Setter Property="Height" Value="{Binding Path=Value, ElementName=sizeSlider, Mode=TwoWay}"/>
                         <Setter Property="TabIndex" Value="1"/>
                                           </Style>
                </ListBox.ItemContainerStyle>

有人可以指导吗?

【问题讨论】:

    标签: wpf user-controls slider listboxitem


    【解决方案1】:

    如果你真的需要从一个用户控件绑定到另一个用户控件的属性,也许你可以使用这样的东西:

    用户cntrl1: Xaml:

    <UserControl x:Class="ListBoxSliderSizeTest.Usercntrl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" x:Name="MainControl">
       <Grid>
          <Slider Maximum="200" Minimum="1" Value="{Binding ElementName=MainControl, Path=SliderSize, Mode=TwoWay}"/>   
       </Grid>
    

    代码隐藏:

    ...
    public double SliderSize
      {
         get { return (double)GetValue(SliderSizeProperty); }
         set { SetValue(SliderSizeProperty, value); }
      }
    
      public static readonly DependencyProperty SliderSizeProperty =
          DependencyProperty.Register("SliderSize", typeof(double), typeof(Usercntrl1), new PropertyMetadata(0.0));
    ...
    

    UserCntrl2: XAML:

    <UserControl x:Class="ListBoxSliderSizeTest.Usercntrl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" x:Name="MainControl">
    <Grid>
            <ListBox>
                <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
                    <Setter Property="Padding" Value="0"/>
                    <Setter Property="Margin" Value="1"/>
                    <Setter Property="BorderBrush" Value="Green"/>
                    <Setter Property="Width" Value="{Binding Path=SliderSize, ElementName=MainControl, Mode=OneWay}"/>
                    <Setter Property="Height" Value="{Binding Path=SliderSize, ElementName=MainControl, Mode=OneWay}"/>
                    <Setter Property="TabIndex" Value="1"/>
                </Style>
    
            </ListBox.ItemContainerStyle>
                <Button/>
            </ListBox>
    </Grid>
    

    代码隐藏:

    ---
          public double SliderSize
      {
         get { return (double)GetValue(SliderSizeProperty); }
         set { SetValue(SliderSizeProperty, value); }
      }
    
      public static readonly DependencyProperty SliderSizeProperty =
          DependencyProperty.Register("SliderSize", typeof(double), typeof(Usercntrl2), new PropertyMetadata(0.0));
    ...
    

    然后使用这两个用户控件:

    <listBoxSliderSizeTest:Usercntrl1 x:Name="Usercntrl1"/>
        <listBoxSliderSizeTest:Usercntrl2 Grid.Column="1" SliderSize="{Binding ElementName=Usercntrl1, Path=SliderSize}"/>
    

    编辑:

    所以如果 Usercntrl1 托管 UserControl2,它看起来像这样:

    用户cntrl1:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Slider Maximum="200" Minimum="1" Value="{Binding ElementName=MainControl, Path=SliderSize, Mode=TwoWay}" x:Name="Slider"/>
        <listBoxSliderSizeTest:Usercntrl2 Grid.Row="1" SliderSize="{Binding ElementName=MainControl, Path=SliderSize}" />
    </Grid>
    

    或:

        <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Slider Maximum="200" Minimum="1" x:Name="Slider"/>
        <listBoxSliderSizeTest:Usercntrl2 Grid.Row="1" SliderSize="{Binding ElementName=Slider, Path=Value}" />
    </Grid>
    

    编辑2:

    用户控件1 XAML:

    <Slider Maximum="200" Minimum="1" x:Name="Slider" Value="{Binding ElementName=MainControl, Path=SliderSize, Mode=TwoWay}" />
    <TabControl x:Name="tc" Grid.Row="1"/>
    

    后面的代码:

    var uc = new Usercntrl2();
         var binding = new Binding("SliderSize") { Source = this,Mode = BindingMode.TwoWay};
         uc.SetBinding(Usercntrl2.SliderSizeProperty, binding);
         tc.Items.Add(uc);
    

    【讨论】:

    • 非常感谢,它在原型中完美运行,而且我对我的场景有疑问,即 Usercntrl1 as SliderUsrcntrl 承载 Usercntrl2 as ListboxUsrcntrl,所以我注册了 SliderSize 依赖属性,现在在 ListboxUsrcntrl XAML 中的两个 usercntrls 我想将 ListboxUsrcntrl Slidersize 的值分配为 ListboxUsrcntrl.SliderSize="{Binding ElementName=Slider Path=SliderSize}"我不知道在哪里编写这样的代码。提前谢谢。
    • 我编辑了我的样本。但我不确定您在上面的评论中提出的问题是什么
    • @ rhe ,再次感谢,我对我的场景感到困惑,实际上 Usercntrl1 包含 Tabcontrol 和 Slider,其中 tabitems 在后面的代码中动态加载是 usercntrl2(listbox),usercntrl1 没有参考在你上面提到的XAML中,所以我只是坚持分配usercntrl2 Slidervalue,sry for nusense。当我把它作为原型时,无论你给它什么完美的工作。就像我必须在 usercntrl2XAML 本身中分配 usecntrl2.SliderSize="{Binding ElementName=usercntrl1, Path=SliderSize}" ,是这样吗?这是这样做的仪式方式吗?再次感谢。
    • 现在我有点困惑 ;-) 你想在后面的代码中创建绑定吗?然后绑定看起来像我的示例中的edit2。还是 usercntrl1 根本不知道 usercntrl2?
    • 又是一个小疑问:-) 当我更改滑块值时,listboxitems 的大小会发生变化,但它可能适用于所有 tabitem,我只希望它只用于活动选项卡..
    【解决方案2】:

    对于您上一条评论中的问题(仅将尺寸应用于活动项目):

    使用触发器:

     <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True">
           <Setter Property="Width" Value="{Binding Path=SliderSize, ElementName=MainControl, Mode=OneWay}"/>
           <Setter Property="Height" Value="{Binding Path=SliderSize, ElementName=MainControl, Mode=OneWay}"/>
        </DataTrigger>
     </Style.Triggers>
    

    还是要将其应用于活动选项卡中的所有项目?

    【讨论】:

    • 不,我只需要它用于列表框项目,如果我想应用于所有项目?我在哪里应用这个触发器 usercntrl1(TabControl) 或 usercntrl2(Listbox)?而且现在所有选项卡项目都包含带有图像作为列表框项目的列表框,并且假设如果我有除列表框以外的更多控件,是否可以将滑块大小值应用于当前活动选项卡中存在的所有项目?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多