Попытка получить значение ползунка из родительского контроля - PullRequest
1 голос
/ 29 января 2010

Я пытаюсь получить значение ползунка, содержащегося в окне, из пользовательского элемента управления, также содержащегося в этом окне.

это то, чего я хотел бы достичь.

<Window x:Class="TestApp3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1">
    <Window.Resources>

        <Style x:Key="SliderStyle" TargetType="{x:Type Slider}">
            <Setter Property="Value" Value="10" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Interval" Value="1" />
            <Setter Property="Minimum" Value="5" />
            <Setter Property="Maximum" Value="50" />
            <Setter Property="TickFrequency" Value="0.25" />
            <Setter Property="IsSnapToTickEnabled" Value="True" />
            <Setter Property="Width" Value="100" />
        </Style>

        <Style TargetType="{x:Type TextBox}">
            <Setter Property="FontSize" Value="{Binding ElementName=SliderFont, Path=Value}" />
        </Style>

    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <TextBox Grid.Row="0" Text="Test" />
        <Border
            Grid.Row="1"
            Background="Purple" 
            BorderBrush="Black"
            BorderThickness="1"
            HorizontalAlignment="Center"
            VerticalAlignment="Center">
            <Grid Margin="10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Label
                    Grid.Column="0"
                    FontSize="16"
                    Content="Font Size:"/>
                <TextBox 
                    Grid.Column="1"
                    FontSize="16"
                    Text="{Binding ElementName=SliderFont, Path=Value, Mode=TwoWay}"
                    Width="50"
                    MaxLength="5" />
                <Slider 
                    Style="{DynamicResource SliderStyle}"
                    Grid.Column="2"
                    Name="SliderFont" />
            </Grid>
        </Border>
    </Grid>
</Window>

та же идея, но с использованием usercontrol.

<Window x:Class="TestApp3.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestApp3"
    Title="Window1">
    <Window.Resources>

        <Style x:Key="SliderStyle" TargetType="{x:Type Slider}">
            <Setter Property="Value" Value="10" />
            <Setter Property="HorizontalAlignment" Value="Left" />
            <Setter Property="VerticalAlignment" Value="Center" />
            <Setter Property="Interval" Value="1" />
            <Setter Property="Minimum" Value="5" />
            <Setter Property="Maximum" Value="50" />
            <Setter Property="TickFrequency" Value="0.25" />
            <Setter Property="IsSnapToTickEnabled" Value="True" />
            <Setter Property="Width" Value="100" />
        </Style>

        <Style TargetType="{x:Type TextBox}">
            <Setter Property="FontSize" Value="{Binding ElementName=SliderFont, Path=Value}" />
        </Style>

    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <!--<TextBox Grid.Row="0" Text="Test" />-->
        <local:myusercontrol Grid.Row="0" />
        <Border
            Grid.Row="1"
            Background="Purple" 
            BorderBrush="Black"
            BorderThickness="1"
            HorizontalAlignment="Center"
            VerticalAlignment="Center">
            <Grid Margin="10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Label
                    Grid.Column="0"
                    FontSize="16"
                    Content="Font Size:"/>
                <TextBox 
                    Grid.Column="1"
                    FontSize="16"
                    Text="{Binding ElementName=SliderFont, Path=Value, Mode=TwoWay}"
                    Width="50"
                    MaxLength="5" />
                <Slider 
                    Style="{DynamicResource SliderStyle}"
                    Grid.Column="2"
                    Name="SliderFont" />
            </Grid>
        </Border>
    </Grid>
</Window>

Пользовательский контроль

<UserControl x:Class="TestApp3.myusercontrol"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBox Text="Test" />
    </Grid>
</UserControl>

Размер шрифта в текстовом поле usercontrols не увеличивается вообще. причина, по которой я хочу, чтобы это работало, заключается в том, что я хотел бы добавить что-то подобное в наши темы, чтобы нам не пришлось беспокоиться об этом позже. Я слишком долго возился с этим. Любые идеи о том, как заставить это работать, были бы великолепны.

я знаю, что могу передать значение FontSize в usercontrol, но я бы хотел иметь возможность управлять несколькими элементами управления FontSize.

Надеюсь, это имеет смысл, ~ Сапоги

Ответы [ 2 ]

0 голосов
/ 01 февраля 2010

Я получил его на работу, используя XML-файл в качестве ресурса.

Просто добавьте это к своим ресурсам

<XmlDataProvider x:Key="XmlFontFile" Source="pack://application:,,,/TestApp3;component/XMLFile1.xml" />

и это к вашему SliderStyle

<Setter Property="Value" Value="{Binding Source={StaticResource XmlFontFile}, XPath=Style/TextBoxFontSize, Mode=TwoWay}" />

и это к вашему TextBoxStyle

<Setter Property="FontSize" Value="{Binding Source={StaticResource XmlFontFile}, XPath=Style/TextBoxFontSize}" />

мой xml-файл выглядит как

<?xml version="1.0" encoding="utf-8" ?>

0 голосов
/ 30 января 2010

Хорошо, это заняло у меня немного времени, но я наконец заработал.

Вам необходимо создать свойство зависимостей в вашем пользовательском элементе управления (это в коде позади - в данном случае C #):

    public static readonly DependencyProperty UCFontSizeProperty = DependencyProperty.Register(
      "UCFontSize", typeof(double), typeof(myusercontrol));

    public double UCFontSize
    {
        get { return (double)this.GetValue(UCFontSizeProperty); }
        set { this.SetValue(UCFontSizeProperty, value); }
    }

Тогда в пользовательском элементе управления XAML есть:

<UserControl x:Class="TestApp3.myusercontrol"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="TextBoxUserControl"
    Height="200" Width="250">
    <Grid>
        <TextBox Text="Test" FontSize="{Binding ElementName=TextBoxUserControl, Path=UCFontSize}" x:Name="UCTextBox" />
    </Grid>
</UserControl>

Затем добавьте еще один установщик стиля:

<Style TargetType="{x:Type local:U myusercontrol}">
    <Setter Property="UCFontSize" Value="{Binding ElementName=SliderFont, Path=Value}" />
</Style>

Вам не нужно менять способ создания пользовательского элемента управления на главной странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...