Как добавить событие нажатия на текстовый блок списка? - PullRequest
1 голос
/ 29 апреля 2011

Я занимаюсь разработкой приложения для 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>

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

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

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

Ответы [ 4 ]

4 голосов
/ 29 апреля 2011

вы можете обернуть текстовый блок сеткой и придать ему прозрачный цвет.Затем вы присоединяете NavigateToPageAction к Grid, что-то вроде этого,

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>

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

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

Обновить:

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

В моем собственном проекте я создал простой стиль для кнопки, которая действует как кликабельнаяTextBlock.Еще одна полезная вещь при использовании кнопки - она ​​может получать эффект 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>
1 голос
/ 07 августа 2012

Вот что я сделал, используя VS2010.

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

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

0 голосов
/ 31 июля 2014

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

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

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

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

...