[WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: Omitishi  
Дата: 01.12.14 15:09
Оценка:
Привет!
Есть вот такой UserControl, представляющий собой один вопрос из теста:

Как видно на скрине, в его Grid 2 колонки и одна строка. В первой колонке содержится всегда TextBox с именем Question, во второй может содержаться CheckBox, ComboBox, TextBox, NumericUpDown (от eisiWare) — в общем объект, унаследованный от класса System.Windows.Controls.Control, его имя Answer. Конкретный класс объекта Answer выбирается в зависимости от типа ответа на вопрос. Сам UserControl создается исключительно в коде программы, соответственно доступ к его разметке достаточно затруднен.
В общем, добрые люди, подскажите, пожалуйста, как мне сделать, чтобы при клике мышкой на ячейку с Answer происходило событие клика и на Answer, даже если конкретно на Answer клика и не было? Это необходимо только для CheckBox. Я уже пробовал маршрутизируемые события, но у меня ничего толкового не получилось, т.к. опыта с WPF практически нет
Надеюсь на вашу помощь
wpf usercontrol
Re: [WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: vit_as Россия  
Дата: 02.12.14 05:33
Оценка:
Здравствуйте, Omitishi, Вы писали:

O>Привет!

O>Есть вот такой UserControl, представляющий собой один вопрос из теста:
O>Image: a217453168.jpg
O>Как видно на скрине, в его Grid 2 колонки и одна строка. В первой колонке содержится всегда TextBox с именем Question, во второй может содержаться CheckBox, ComboBox, TextBox, NumericUpDown (от eisiWare) — в общем объект, унаследованный от класса System.Windows.Controls.Control, его имя Answer. Конкретный класс объекта Answer выбирается в зависимости от типа ответа на вопрос. Сам UserControl создается исключительно в коде программы, соответственно доступ к его разметке достаточно затруднен.
O>В общем, добрые люди, подскажите, пожалуйста, как мне сделать, чтобы при клике мышкой на ячейку с Answer происходило событие клика и на Answer, даже если конкретно на Answer клика и не было? Это необходимо только для CheckBox. Я уже пробовал маршрутизируемые события, но у меня ничего толкового не получилось, т.к. опыта с WPF практически нет
O>Надеюсь на вашу помощь

Одно из наиболее простых, на мой взгляд, решений — переопределить шаблон CheckBox'а, таким образом, чтобы он растягивался на всю ячейку.

         <Style TargetType="{x:Type CheckBox}">
                    <Setter Property="BorderThickness"
                            Value="1" />
                    <Setter Property="BorderBrush"
                            Value="Silver" />
                    <Setter Property="Background"
                            Value="Transparent" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type CheckBox}">
                                <Border SnapsToDevicePixels="True"
                                        Background="Transparent">
                                    <Border  SnapsToDevicePixels="True"
                                             Width="14"
                                             Height="14"
                                             BorderThickness="{TemplateBinding BorderThickness}"
                                             BorderBrush="{TemplateBinding BorderBrush}">
                                        <Path Fill="#FFF96E2E"
                                              Name="checkGlyph"
                                              Visibility="Hidden"
                                              Stretch="Fill"
                                              Data="M102.03442,598.79645 L105.22962,597.78918 L106.78825,600.42358 C106.78825,600.42358 108.51028,595.74304 110.21724,593.60419 C112.00967,591.35822 114.89314,591.42316 114.89314,591.42316 C114.89314,591.42316 112.67844,593.42645 111.93174,594.44464 C110.7449,596.06293 107.15683,604.13837 107.15683,604.13837 z" />
                                    </Border>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver"
                                             Value="True">
                                        <Setter Property="BorderBrush"
                                                Value="Black" />
                                        <Setter Property="Fill"
                                                TargetName="checkGlyph"
                                                Value="#FFFF5E2E" />
                                    </Trigger>
                                    <Trigger Property="IsChecked"
                                             Value="True">
                                        <Setter Property="Visibility"
                                                TargetName="checkGlyph"
                                                Value="Visible" />
                                    </Trigger>
                                    <Trigger Property="IsEnabled"
                                             Value="False">
                                        <Setter Property="BorderBrush"
                                                Value="Gray" />
                                        <Setter Property="Fill"
                                                TargetName="checkGlyph"
                                                Value="#FFD6D6D6" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
Re[2]: [WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: Omitishi  
Дата: 03.12.14 00:03
Оценка:
Здравствуйте, vit_as, Вы писали:

_>Одно из наиболее простых, на мой взгляд, решений — переопределить шаблон CheckBox'а, таким образом, чтобы он растягивался на всю ячейку.


_>
_>         <Style TargetType="{x:Type CheckBox}">
_>                    <Setter Property="BorderThickness"
_>                            Value="1" />
_>                    <Setter Property="BorderBrush"
_>                            Value="Silver" />
_>                    <Setter Property="Background"
_>                            Value="Transparent" />
_>                    <Setter Property="Template">
_>                        <Setter.Value>
_>                            <ControlTemplate TargetType="{x:Type CheckBox}">
_>                                <Border SnapsToDevicePixels="True"
_>                                        Background="Transparent">
_>                                    <Border  SnapsToDevicePixels="True"
_>                                             Width="14"
_>                                             Height="14"
_>                                             BorderThickness="{TemplateBinding BorderThickness}"
_>                                             BorderBrush="{TemplateBinding BorderBrush}">
_>                                        <Path Fill="#FFF96E2E"
_>                                              Name="checkGlyph"
_>                                              Visibility="Hidden"
_>                                              Stretch="Fill"
_>                                              Data="M102.03442,598.79645 L105.22962,597.78918 L106.78825,600.42358 C106.78825,600.42358 108.51028,595.74304 110.21724,593.60419 C112.00967,591.35822 114.89314,591.42316 114.89314,591.42316 C114.89314,591.42316 112.67844,593.42645 111.93174,594.44464 C110.7449,596.06293 107.15683,604.13837 107.15683,604.13837 z" />
_>                                    </Border>
_>                                </Border>
_>                                <ControlTemplate.Triggers>
_>                                    <Trigger Property="IsMouseOver"
_>                                             Value="True">
_>                                        <Setter Property="BorderBrush"
_>                                                Value="Black" />
_>                                        <Setter Property="Fill"
_>                                                TargetName="checkGlyph"
_>                                                Value="#FFFF5E2E" />
_>                                    </Trigger>
_>                                    <Trigger Property="IsChecked"
_>                                             Value="True">
_>                                        <Setter Property="Visibility"
_>                                                TargetName="checkGlyph"
_>                                                Value="Visible" />
_>                                    </Trigger>
_>                                    <Trigger Property="IsEnabled"
_>                                             Value="False">
_>                                        <Setter Property="BorderBrush"
_>                                                Value="Gray" />
_>                                        <Setter Property="Fill"
_>                                                TargetName="checkGlyph"
_>                                                Value="#FFD6D6D6" />
_>                                    </Trigger>
_>                                </ControlTemplate.Triggers>
_>                            </ControlTemplate>
_>                        </Setter.Value>
_>                    </Setter>
_>                </Style>
_>


Но, как я упоминал в первом сообщении, контрол создается в коде программы, то есть CheckBox добавляется на Grid программно, поэтому непонятно, как получить доступ к XAML контрола и осуществить показанные Вами изменения.
Быть может есть способ сделать это при создании CheckBox?
Re[3]: [WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: vit_as Россия  
Дата: 03.12.14 05:21
Оценка:
Здравствуйте, Omitishi, Вы писали:


O>Но, как я упоминал в первом сообщении, контрол создается в коде программы, то есть CheckBox добавляется на Grid программно, поэтому непонятно, как получить доступ к XAML контрола и осуществить показанные Вами изменения.


Советую почитать про MVVM и использовать не Grid, а контрол производный от ItemsControl, например DataGrid.

O>Быть может есть способ сделать это при создании CheckBox?


Для того, чтобы стиль чекбокса "подцепился", нужно добавить его в ресурсы Вашего Grid'a.

<Grid>
    <Grid.RowDefinitions>
    ...
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
    ...
    </Grid.ColumnDefinitions>
    <Grid.Resources>
        <Style TargetType="CheckBox">
        ...
        </Style>
    </Grid.Resources>
</Grid>
Re[4]: [WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: Omitishi  
Дата: 04.12.14 23:08
Оценка:
Здравствуйте, vit_as, Вы писали:

_>Здравствуйте, Omitishi, Вы писали:



O>>Но, как я упоминал в первом сообщении, контрол создается в коде программы, то есть CheckBox добавляется на Grid программно, поэтому непонятно, как получить доступ к XAML контрола и осуществить показанные Вами изменения.


_>Советую почитать про MVVM и использовать не Grid, а контрол производный от ItemsControl, например DataGrid.


O>>Быть может есть способ сделать это при создании CheckBox?


_>Для того, чтобы стиль чекбокса "подцепился", нужно добавить его в ресурсы Вашего Grid'a.


_>
_><Grid>
_>    <Grid.RowDefinitions>
_>    ...
_>    </Grid.RowDefinitions>
_>    <Grid.ColumnDefinitions>
_>    ...
_>    </Grid.ColumnDefinitions>
_>    <Grid.Resources>
_>        <Style TargetType="CheckBox">
_>        ...
_>        </Style>
_>    </Grid.Resources>
_></Grid>
_>


Спасибо огромное за Ваш совет, хотя чекбокс даже с новым стилем не растягивается на всю ячейку, но я просто сделал размер чекбокса больше, в принципе такое решение проблемы мне тоже подходит . Еще раз, спасибо за ответ
Re: [WPF] Как перенаправить клик по ячейке Grid на CheckBox?
От: joher  
Дата: 11.12.14 14:26
Оценка:
Здравствуйте, Omitishi, Вы писали:

O>Привет!

O>Есть вот такой UserControl, представляющий собой один вопрос из теста:
O>Image: a217453168.jpg
O>Как видно на скрине, в его Grid 2 колонки и одна строка. В первой колонке содержится всегда TextBox с именем Question, во второй может содержаться CheckBox, ComboBox, TextBox, NumericUpDown (от eisiWare) — в общем объект, унаследованный от класса System.Windows.Controls.Control, его имя Answer. Конкретный класс объекта Answer выбирается в зависимости от типа ответа на вопрос. Сам UserControl создается исключительно в коде программы, соответственно доступ к его разметке достаточно затруднен.
O>В общем, добрые люди, подскажите, пожалуйста, как мне сделать, чтобы при клике мышкой на ячейку с Answer происходило событие клика и на Answer, даже если конкретно на Answer клика и не было? Это необходимо только для CheckBox. Я уже пробовал маршрутизируемые события, но у меня ничего толкового не получилось, т.к. опыта с WPF практически нет
O>Надеюсь на вашу помощь

Если textbox не подразумевает ввода то зачем его использовать. Можно заменить его на label который будет вести на checkbox.
<TextBox Name="tb" Width="50"/>
<Label Target="{Binding ElementName=tb}">_File</Label>

еще один вариант это подписка на событие MouseRigthButtonDown и устонавливать значение textbox в callback'e
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.