我有两个Usercontrols说“Usercntrl1”和“Usercntrl2”,“Usercntrl1”包含 Slider ,“Usercntr2”有带有图像的ListBox ,现在当我在“Usercntrl1”中更改滑块值时, ListboxItems大小(即)宽度和高度必须更改为Respect to滑块价值。 当它们都存在于同一个用户控件中时,它可以很容易地完成,如下所示
<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>
有人可以指导吗?
答案 0 :(得分:1)
如果你真的需要从一个usercontrol绑定到另一个UserControl的属性,也许你可以使用这样的东西:
Usercntrl1: 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));
...
然后使用这两个Usercontrols:
<listBoxSliderSizeTest:Usercntrl1 x:Name="Usercntrl1"/>
<listBoxSliderSizeTest:Usercntrl2 Grid.Column="1" SliderSize="{Binding ElementName=Usercntrl1, Path=SliderSize}"/>
编辑:
所以如果Usercntrl1托管UserControl2,它看起来像这样:
Usercntrl1:
<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>
EDIT2:
的UserControl1 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);
答案 1 :(得分:0)
在上一条评论中提出您的问题(仅将尺寸应用于活动项目):
使用触发器:
<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>
或者您想将它应用于活动标签中的所有项目吗?