Странное поведение со свойством TextBox.Foreground.Opacity - PullRequest
2 голосов
/ 13 января 2012

Я создал шаблон управления Silverlight.Управление состоит из 4 элементов: 2 текстового поля и 2 текстового блока.разметка (в generic.xaml):

<Style TargetType="local:InputForm">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:InputForm">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="Login" Grid.Column="0" Grid.Row="0"/>
                            <TextBlock Text="Password" Grid.Column="0" Grid.Row="1"/>
                            <TextBox x:Name="LoginTextBox" Grid.Column="1" Grid.Row="0" Text="Login..."/>
                            <TextBox x:Name="PasswordTextBox" Grid.Column="1" Grid.Row="1" Text="Password..."/>
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

В файле кода я получаю текстовое поле из шаблона и устанавливаю свойство Foreground.Opacity равным 0,5.код:

public class InputForm : Control
{
    private TextBox _loginTextBox;
    private TextBox _passwordTextBox;

    public InputForm()
    {
        this.DefaultStyleKey = typeof(InputForm);
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        _loginTextBox = this.GetTemplateChild("LoginTextBox") as TextBox;
        _passwordTextBox = this.GetTemplateChild("PasswordTextBox") as TextBox;

        SetInActive();
    }

    private void SetInActive()
    {
        _loginTextBox.Foreground.Opacity = .5;
        _passwordTextBox.Foreground.Opacity = .5;
    }
}

Когда я добавил этот элемент управления в мое приложение silverlight, все элементы текстовых полей начали представлять текст с Foreground.Opacity = 0.5 Запустить приложение:

First tab before oper login tab

Выберите вкладку «Логин»:

Login tab

Вернуться на вкладку «Некоторая информация»:

First tab after open login tab

Образец находится здесь: http://perpetuumsoft.com/Support/silverlight/SilverlightApplicationOpacity.zip Это ошибка с Silverlight или я что-то не так делаю?

1 Ответ

1 голос
/ 13 января 2012

Проблема в том, что свойство Foreground имеет тип Brush, который является ссылочным типом (классом).

Когда вы присваиваете .Opacity = 0.5, вы изменяете значение непрозрачности для ссылочной Brush,Будут затронуты все другие элементы, которые ссылаются на одну и ту же кисть.

Обычно мы используем Storyboard в VisualStateManager в шаблоне элемента управления, чтобы указать внешний вид элемента управления в различных «состояниях».

Однако быстрое исправление для вашего кода:

private void SetInActive()     
{     
    Brush brush = new SolidColorBrush(Colors.Black) { Opacity = 0.5 };
    _loginTextBox.Foreground = brush    
    _passwordTextBox.Foreground= brush
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...