Как добавить событие клика в текстовый блок списка?

Я разрабатываю приложение для Windows Phone 7. У меня есть список в моем приложении. Я делаю динамическую привязку к этому списку. Код списка выглядит следующим образом:

<ListBox x:Name="FirstListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,17" Width="432">
                <TextBlock  Text="{Binding ID}" Width="440"></TextBlock>
                <TextBlock Text="{Binding IsCompany}" Width="440"></TextBlock>                                                                       
                <TextBlock Foreground="Red" Text="{Binding CompanyORIndividual}" Width="440"></TextBlock>                                                                            
                <TextBlock  Text="{Binding MicrosoftContact}" Width="440"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.Template>
        <ControlTemplate>
            <ScrollViewer HorizontalScrollBarVisibility="Visible">
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
        </ListBox.Template>
</ListBox>

Этот список находится внутри элемента управления Pivot. Я хочу добавить ссылку или щелкнуть событие в следующем текстовом блоке.

<TextBlock Foreground="Red" Text="{Binding CompanyORIndividual}" Width="440"></TextBlock>

Так что после нажатия на текстовый блок CompanyORIndividual пользователь должен перейти на другую страницу xaml. Как это сделать. Не могли бы вы предоставить мне код с обработчиком событий? Не могли бы вы предоставить мне код или ссылку, с помощью которой я могу решить вышеуказанную проблему? Если я делаю что-то не так, пожалуйста, направьте меня. Если есть идея получше, чем мой вопрос выше, пожалуйста, предложите ее.


person Shailesh Jaiswal    schedule 29.04.2011    source источник
comment
Вы действительно помещаете список с горизонтальной прокруткой внутри PivotItem? Это может привести к тому, что жесты в списке будут неправильно интерпретированы как жесты на элементе сводки и наоборот. Это то, что обычно не рекомендуется, и вы должны тщательно проверить это на реальных пользователях.   -  person Matt Lacey    schedule 29.04.2011


Ответы (4)


вы можете обернуть TextBlock сеткой и придать ему прозрачный цвет. Затем вы прикрепляете NavigateToPageAction к сетке примерно так:

xmlns:Custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ic="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"

<Grid Background="Transparent">
    <Custom:Interaction.Triggers>
        <Custom:EventTrigger EventName="MouseLeftButtonDown">
            <ic:NavigateToPageAction TargetPage="/Views/YourView.xaml" />
        </Custom:EventTrigger>
    </Custom:Interaction.Triggers>
<TextBlock Foreground="Red" Text="{Binding CompanyORIndividual}" HorizontalAlignment="Left"/>
</Grid>

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

В качестве альтернативы вы можете обернуть TextBlock кнопкой, а затем обработать событие нажатия кнопки.

Обновление:

Мэтт прав в том, что использование MouseLeftButtonDown/MouseLeftButtonUp иногда может быть плохим.

В моем собственном проекте я создал простой стиль для кнопки, которая действует как интерактивный текстовый блок. Еще одна хорошая вещь в использовании кнопки — она может получить TiltEffect и позволить управлять.

<Style x:Key="TextButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="Foreground" Value="{StaticResource PhoneAccentBrush}"/>
    <Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/>
    <Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiLight}"/>
    <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeLarge}"/>
    <Setter Property="Padding" Value="{StaticResource PhoneTouchTargetOverhang}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Background="Transparent">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="MouseOver"/>
                            <VisualState x:Name="Pressed"/>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="HorizontalAlignment" Value="Left"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
</Style>
person Justin XL    schedule 29.04.2011

Я рекомендую использовать жест Tap (из Silverlight Toolkit) для TextBlock. Это позволит избежать проблем с неправильным определением событий нажатия кнопки мыши вверх или вниз, когда пользователь прокручивает список. На мой взгляд, это также обеспечивает лучший пользовательский интерфейс, чем обнаружение изменений SelectedItem в списке.

person Matt Lacey    schedule 29.04.2011
comment
+1, я думаю, что вы правы, я обновлю свой ответ, чтобы вместо этого использовать кнопку. нажатие и нажатие кнопки должны работать одинаково, верно? - person Justin XL; 01.05.2011

Вот что я сделал с помощью VS2010.

  1. Выберите элемент управления TextBlock в окне xaml.
  2. В окне свойств выберите События.
  3. Найдите MouseLeftButtonUp и дважды щелкните текстовое поле пустого значения, что приведет вас к коду xaml.cs за окном и создаст новый метод.
  4. Поместите this.Close(); в этот метод.
person nik220    schedule 07.08.2012

В качестве обходного пути для аналогичной проблемы, с которой я столкнулся в WP8 (Silverlight), я использовал кнопку с прозрачным фоном и обработчик события Click.

Теперь проблема заключается в том, что всякий раз, когда пользователь касается/нажимает кнопку, сплошной цвет PhoneAccent устанавливается в качестве фона кнопки (в течение периода времени, когда пользователь ее держит).

Чтобы избежать этого, вы можете установить кнопку ClickMode="Pressed", а в событии Click сделать фон прозрачным с помощью MyButton.Background = new SolidColorBrush(Colors.Transparent);

Фон становится прозрачным всякий раз, когда событие Click запускается с кнопкой в ​​состоянии Pressed, поэтому цвет фона устанавливается на кнопку, когда она находится в этом состоянии. Если не установить ClickMode="Pressed", цвет фона не будет установлен, когда кнопка находится в нажатом состоянии.

person Shishir Gupta    schedule 31.07.2014