Доступ к ресурсу через полное имя объекта вместо строки - PullRequest
0 голосов
/ 14 февраля 2020

Я меняю стиль элемента управления во время выполнения. Скажем, изменив текстовое поле только для чтения (и, следовательно, изменив другие свойства текстового поля, влияющие на отображение), если пользователь находится в «режиме просмотра».

Допустим, у меня есть стиль в ресурсах приложения.

    <Style x:Key="ReadOnlyTextBoxStyle" TargetType="{x:Type TextBox}">
        <Setter Property="BorderBrush" Value="Black"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Cursor" Value="Arrow"/>
        <Setter Property="Background" Value="White"/>
        <Setter Property="IsReadOnly" Value="True"/>
        <Setter Property="TextBlock.FontWeight" Value="Bold"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
        <Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True" Background="{TemplateBinding Background}">
                        <ScrollViewer Name="PART_ContentHost"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Я нашел несколько подходов к ссылке на ресурс в коде через строку, например,

myTextBox.Style = (Style).Resources["ReadOnlyTextBoxStyle"];

Но я не могу найти пример доступа к ресурсу через что-то вроде this:

myControl.Style = (Style).Resources[nameOf(IsThere.Some.Way.To.Get.QualifiedReferenceToStyleResourceKey)];

Если я использую что-то вроде:

myControl.Style = (Style).Resources["ReadOnlyTextBoxStyle"];

, а затем я обновляю ключ до новой строки, например «ReadOnlyTextBoxStyleModified», тогда я должен менять ее везде, на которые ссылаюсь это в коде. Если я пропущу одну из замен, я не получу ошибку до времени выполнения. Я бы предпочел видеть ошибку во время компиляции, если это возможно.

Ответ в связанном ниже вопросе предложил использовать именованную константу, но затем не дал пример. Кажется, что это достигнет sh того, к чему я стремлюсь, но я не понимаю, как реализовать его комментарий, в котором говорится: «1017 *

». Кроме того, хорошей практикой является создание строковой константы, которая отображает имя вашего ключа в словаре ресурсов (чтобы вы могли изменить его только в одном месте). "

Доступ к ресурсу с помощью codebehind в WPF

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете создать класс со стати c строковыми членами для своих ключей ресурса, например

public static class ResourceKeys
{
    public static string Key1 = "Key1";
}

, а затем объявить ресурс с таким ключом, например

<Window.Resources>
    <SolidColorBrush x:Key="{x:Static local:ResourceKeys.Key1}" Color="Red"/>
</Window.Resources>

и используйте этот ресурс по ключу, например

<Grid Background="{StaticResource ResourceKey={x:Static local:ResourceKeys.Key1}}">

или

grid.Background = (Brush)FindResource(ResourceKeys.Key1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...