私が欲しいと言っTextBlock
持っているそのWidth
に等しく、それの親コンテナのWidth
(すなわち、左右にストレッチ)、またはそれの親コンテナの割合Width
私はこれを達成することができますどのように、XAML
絶対値を指定せず?
これを実行して、親コンテナーコンテナーが後で展開された(Width
増加した)場合に、その子要素も自動的に展開されるようにします。(基本的に、HTMLやCSSのように)
私が欲しいと言っTextBlock
持っているそのWidth
に等しく、それの親コンテナのWidth
(すなわち、左右にストレッチ)、またはそれの親コンテナの割合Width
私はこれを達成することができますどのように、XAML
絶対値を指定せず?
これを実行して、親コンテナーコンテナーが後で展開された(Width
増加した)場合に、その子要素も自動的に展開されるようにします。(基本的に、HTMLやCSSのように)
回答:
グリッド内にテキストボックスを配置して、グリッドの行または列にパーセント値を設定し、テキストボックスを親セルに自動入力できます(デフォルトのように)。例:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" />
<TextBox Grid.Column="1" />
</Grid>
これで#1は幅の2/5、#2は3/5になります。
通常、シナリオに適した組み込みのレイアウトコントロールを使用します(たとえば、親に対して相対的にスケーリングする場合は、グリッドを親として使用します)。任意の親要素でそれを実行したい場合は、ValueConverterを作成してそれを実行できます。ただし、どうしても必要な場合は、次のようにすることができます。
public class PercentageConverter : IValueConverter
{
public object Convert(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
return System.Convert.ToDouble(value) *
System.Convert.ToDouble(parameter);
}
public object ConvertBack(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
これは次のように使用でき、親キャンバスの幅の10%の子テキストボックスを取得します。
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:PercentageConverter x:Key="PercentageConverter"/>
</Window.Resources>
<Canvas x:Name="canvas">
<TextBlock Text="Hello"
Background="Red"
Width="{Binding
Converter={StaticResource PercentageConverter},
ElementName=canvas,
Path=ActualWidth,
ConverterParameter=0.1}"/>
</Canvas>
</Window>
CultureInfo.InvariantCulture
ため、二重変換に追加することを検討する必要があります。parameter
string
decimal separator
次のようなエラーが発生している場合:'2 *'文字列は長さに変換できません。
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*" /><!--This will make any control in this column of grid take 2/5 of total width-->
<ColumnDefinition Width="3*" /><!--This will make any control in this column of grid take 3/5 of total width-->
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition MinHeight="30" />
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0">Your text block a:</TextBlock>
<TextBlock Grid.Column="1" Grid.Row="0">Your text block b:</TextBlock>
</Grid>
<RowDefinition Height="auto" />
?
IValueConverter実装を使用できます。IValueConverterから継承するコンバータークラスは、value
(パーセンテージ)やparameter
(親の幅)などのパラメーターを受け取り、目的の幅の値を返します。XAMLファイルでは、コンポーネントの幅は希望の値で設定されます。
public class SizePercentageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (parameter == null)
return 0.7 * value.ToDouble();
string[] split = parameter.ToString().Split('.');
double parameterDouble = split[0].ToDouble() + split[1].ToDouble() / (Math.Pow(10, split[1].Length));
return value.ToDouble() * parameterDouble;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// Don't need to implement this
return null;
}
}
XAML:
<UserControl.Resources>
<m:SizePercentageConverter x:Key="PercentageConverter" />
</UserControl.Resources>
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
Width="{Binding Converter={StaticResource PercentageConverter}, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualWidth}"
Height="{Binding Converter={StaticResource PercentageConverter}, ConverterParameter=0.6, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Border}},Path=ActualHeight}">
....
</ScrollViewer>
私はそれがXamlではないことを知っていますが、テキストボックスのSizeChangedイベントで同じことをしました:
private void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e)
{
TextBlock textBlock = sender as TextBlock;
FrameworkElement element = textBlock.Parent as FrameworkElement;
textBlock.Margin = new Thickness(0, 0, (element.ActualWidth / 100) * 20, 0);
}
テキストボックスは親のサイズの80%のように見え(右側の余白は20%です)、必要に応じて拡大されます。
相対サイズ設定には2つの方法を使用します。私はと呼ばれるクラス持っているRelative
3つの添付プロパティではTo
、WidthPercent
とHeightPercent
私は要素がビジュアルツリー内の要素の任意の場所の相対的な大きさになりたい場合に便利ですし、コンバータのアプローチよりも少ないハック感じている-ただし、あなたことを、あなたのために働くものを使用満足しています。
他のアプローチはかなり狡猾です。ViewBox
内に相対サイズが必要な場所を追加してから、その中Grid
に幅100のaを追加します。次に、TextBlock
を、幅10のをと、それは明らかに100の10%になります。
ViewBox
拡大縮小されますGrid
ので、ページ上の唯一のことは、その後場合は、それが与えられているものは何でもスペースに応じてGrid
、効果的にスケールアウトされる全幅をして、TextBlock
ページの10%に縮小されます。
に高さを設定しない場合Grid
、コンテンツに合わせて縮小されるため、すべて相対的にサイズが調整されます。コンテンツが高すぎないことを確認する必要があります。つまり、指定されたスペースのアスペクト比を変更しViewBox
始めます。そうしないと、高さもスケーリングされます。あなたは、おそらくでこれを回避することができますStretch
のUniformToFill
。