@den_labs

Как поменять свойство родительского контрола?

Всем привет.

Есть простое окно (см. код ниже), с двумя RadioButton-ми, поскольку текст в них формируется динамически, то использую TextBlock. А т.к. текст может быть произвольной длины, то добавил ScrollViewer и получилось не плохо, но вылезла одна проблема. При нажатии на TextBlock кнопка RadioButton-а не выбирается, приходится нажимать на саму кнопку, что не удобно. Если убрать ScrollViewer, то всё работает нормально.

Есть пару вопросов:
1) Что я упустил и как можно исправить данную проблему?
2) Я пытался капнуть в сторону использования триггеров, если например делаем Click на TextBlock или TextBlock.IsFocused = true, выставлять RadioButton.IsChecked = true, но не смог разобраться как это сделать.
Как поменять свойство у родительского контрола, на основании свойства или события дочернего контрола?

<Window x:Class="ChooseView"
             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="210" d:DesignWidth="436" MaxHeight="210" MaxWidth="436" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
    <Border Padding="5" BorderBrush="Gray" BorderThickness="2">        
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>                
            </Grid.RowDefinitions>
            <TextBlock Text="Выберите пункт назначения" TextWrapping="Wrap" Margin="5"/>
            <StackPanel Grid.Row="1" Margin="5 10 5 5">                                
                <RadioButton Margin="0 0 0 10" MaxHeight="36" IsChecked="{Binding IsFirst}">
                    <ScrollViewer VerticalScrollBarVisibility="Auto">
                        <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"/>
                    </ScrollViewer>
                </RadioButton>                
                <RadioButton Margin="0 0 0 0" MaxHeight="36" IsChecked="{Binding IsSecond}">
                    <TextBlock TextWrapping="Wrap" Text="{Binding SecondInformation}"/>
                </RadioButton>
            </StackPanel>
            <Button Grid.Row="2" Command="{Binding OkCommand}" Content="ОК" HorizontalAlignment="Center" Width="100" Margin="5"/>
        </Grid>
    </Border>
</Window>
  • Вопрос задан
  • 2618 просмотров
Решения вопроса 2
@Sumor
Поставь у скрола свойство IsHitTestVisible в false. Тогда оно будет пропускать события от мыши сквозь себя и радиобатон нормально переключается.
<ScrollViewer VerticalScrollBarVisibility="Auto" IsHitTestVisible="False" >
       <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"/>
</ScrollViewer>


Если есть желание возиться с событиями, то можно предложить такой вариант (но я бы так не стал делать).
<ScrollViewer VerticalScrollBarVisibility="Auto" >
       <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"  MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"/>
</ScrollViewer>

private void TextBlock_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
            var tb = sender as TextBlock;
            // Нужно дополнительно обложиться проверками, что типы совпадают
            ((tb.Parent as ScrollViewer).Parent as RadioButton).IsChecked = true;            
}
Ответ написан
Комментировать
lam0x86
@lam0x86
Я бы попробовал использовать TextBox вместо TextBlock:

<TextBox TextWrapping="Wrap"
         VerticalScrollBarVisibility="Auto"
         IsReadOnly="True"
         Cursor="Arrow"
         Focusable="False"
         BorderThickness="0"
         Text="{Binding FirstInformation}"/>


И ScrollViewer не нужен в этом случае.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@den_labs Автор вопроса
Спасибо за помощь, я же знал, что должен быть более лёгкий способ.
Но, в этом случае тогда не работает скролллирование. Может ещё какое свойство надо настроить?
<ScrollViewer VerticalScrollBarVisibility="Auto" IsHitTestVisible="False" >
       <TextBlock TextWrapping="Wrap" Text="{Binding FirstInformation}"/>
</ScrollViewer>


А вот второй вариант работает на ура (даже триггеры не нужны), хотя мне тоже хочется всё настроить на уровне xaml-а, но что-то пока не удаётся).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы