Как да добавите събитието за щракване върху текстов блок на списъчно поле?

Разработвам приложение за 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 страница. Как да направите това. Можете ли да ми предоставите кода с манипулатора на събития? Можете ли да ми предоставите някакъв код или връзка, чрез които мога да разреша горния проблем? Ако правя нещо нередно, моля, насочете ме. Ако има по-добра идея от горния ми въпрос, моля, предложете я.


person Shailesh Jaiswal    schedule 29.04.2011    source източник
comment
Наистина ли поставяте хоризонтално превъртащо се списъчно поле вътре в PivotItem? Това може да доведе до проблеми с жестовете в списъчната кутия, които се тълкуват погрешно като жест върху осевия елемент и обратно. Това е нещо, което обикновено не се препоръчва и трябва да го тествате щателно с реални потребители.   -  person Matt Lacey    schedule 29.04.2011


Отговори (4)


можете да обвиете TextBlock с мрежа и да му придадете прозрачен цвят. След това прикачвате 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>

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

Като алтернатива можете да обвиете 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>
person Justin XL    schedule 29.04.2011

Бих препоръчал да използвате Tap жест (от Silverlight Toolkit) на TextBlock. Това ще избегне проблеми с неправилно откриване на събития с бутон на мишката нагоре или надолу, когато потребителят превърта списъкното поле. По мое мнение това също осигурява по-добро потребителско изживяване от откриването на SelectedItem, променен в Listbox.

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 се задейства с бутон в състояние Натиснат, така че цветът на фона е зададен на бутон, когато е в това състояние. Ненастройването на ClickMode="Pressed" няма да зададе цвета на фона, когато бутонът е в натиснато състояние.

person Shishir Gupta    schedule 31.07.2014