กำหนด HubSection ที่เลือกใน Hub ด้วย HubSection สองอัน

ฉันมีการควบคุมฮับที่มี HubSections สองอัน เมื่อเลือก HubSection เปลี่ยนแปลง ฉันต้องการเปลี่ยนเนื้อหาของ AppBar ด้วยปุ่มเฉพาะส่วน

เหตุการณ์ Listening SectionsInViewChanged เป็นวิธีแก้ปัญหาทั่วไปที่แนะนำเพื่อใช้ลักษณะการทำงานนี้ แต่เหตุการณ์นี้จะไม่ถูกเริ่มทำงานเมื่อมี HubSections เพียงสองส่วนเท่านั้น

มีเหตุการณ์อื่นที่สามารถใช้เพื่อกำหนด HubSection ปัจจุบันหรือไม่

ขอบคุณ.


person Birkan Cilingir    schedule 18.01.2015    source แหล่งที่มา
comment
คุณได้อ่านความคิดเห็นต่อคำตอบนี้ (โดยเฉพาะความคิดเห็นของ Jerry Nixon) แล้วหรือยัง มีหลายครั้งที่ส่วนฮับปรากฏมากกว่าหนึ่งส่วนบนเพจ แล้วส่วนฮับหลักคือส่วนใด (วางโทรศัพท์ของคุณในโหมดแนวนอนเพื่อดูว่าฉันหมายถึงอะไร) บางทีคุณอาจใช้ตัวควบคุม Pivot แทนก็ได้   -  person Decade Moon    schedule 19.01.2015
comment
อาจทดสอบโซลูชันนี้ visuallylocated.com/post/2014/08/26/ ไม่แน่ใจว่าจะแก้ไขปัญหา 2 ส่วนได้หรือไม่   -  person Depechie    schedule 19.01.2015
comment
@Depechie แม้ว่าปัญหาที่เกิดขึ้นเมื่อมีเพียงสองส่วนเท่านั้นที่ถูกกำหนดเป้าหมายในบทความ แต่กลับไม่สามารถแก้ปัญหาได้ แต่ฉันอาจใช้สิ่งนี้ร่วมกับ HorizontalOffset ของ ScrollViewer เพื่อตัดสินใจว่าจะอยู่ในส่วนแรกหรือส่วนที่สอง ขอบคุณสำหรับลิงค์   -  person Birkan Cilingir    schedule 23.01.2015
comment
@DecadeMoon ใช่ฉันได้อ่านคำตอบนั้นแล้ว แต่ฉันจะใช้พฤติกรรมนี้ในกรณีพิเศษดังนั้นฉันไม่คิดว่ามันจะทำให้เกิดปัญหา   -  person Birkan Cilingir    schedule 23.01.2015


คำตอบ (2)


@Depechie ชี้ให้คุณไปในทิศทางที่ถูกต้อง .. คุณสามารถใช้ การควบคุม SelectionHub ฉันสร้างและเพิ่มเหตุการณ์ลงไปซึ่งจะเริ่มทำงานเมื่อดัชนีที่เลือกเปลี่ยนแปลง

public event EventHandler SelectionChanged;

private static void OnSelectedIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var hub = d as SelectionHub;
    if (hub == null) return;

    // do not try to set the section when the user is swiping
    if (hub._settingIndex) return;

    // No sections?!?
    if (hub.Sections.Count == 0) return;
    hub.OnSelectionChanged();
}

private void OnSelectionChanged()
{
    var section = Sections[SelectedIndex];
    ScrollToSection(section);
    var handler = SelectionChanged;
    if(handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

คุณสามารถขยายสิ่งนี้ได้โดยเพิ่มตัวเลือกที่เปลี่ยนแปลง args ของเหตุการณ์ลงไป ด้วยวิธีนี้ คุณสามารถสมัครรับกิจกรรมในโค้ดของคุณด้านหลัง และเปลี่ยนปุ่มแถบแอปตามดัชนีได้

person Shawn Kendrot    schedule 23.01.2015
comment
ฉันได้ใช้วิธีแก้ปัญหาพฤติกรรมในกลุ่มตัวอย่างของคุณแล้ว เหตุการณ์เริ่มทำงานตามปกติ แต่ hub.Sections.IndexOf(hub.SectionsInView[0]) จะส่งคืนศูนย์เสมอ (ส่วนแรก) เมื่อมีเพียงสองส่วนในฮับ ฉันพลาดอะไรไปรึเปล่า? ฉันเชื่อว่าฉันสามารถใช้ HorizontalOffsetproperty ของ ScrollViewer เพื่อตัดสินใจว่าส่วนใดมีส่วนใหญ่กว่าในมุมมอง แต่ฉันไม่แน่ใจว่านั่นเป็นวิธีแก้ปัญหาที่มีแนวโน้มเกิดข้อผิดพลาดหรือไม่ โดยวิธีการขอบคุณสำหรับบทความ - person Birkan Cilingir; 25.01.2015
comment
ในตอนท้ายของวิธีการแก้ปัญหาในบทความของคุณ ScrollerOnViewChanged ฉันตรวจสอบว่า scrollViewer.HorizontalOffset > (scrollViewer.ViewportWidth / 2) และตัดสินใจว่าส่วนใดมีส่วนที่ใหญ่กว่า ฉันอยากจะเขียนส่วนที่ฉันใช้จากโซลูชันของคุณเป็นคำตอบว่าเหมาะกับคุณหรือไม่ - person Birkan Cilingir; 25.01.2015
comment
เหตุการณ์จะเกิดขึ้นหลายครั้ง และในที่สุดจะแจ้งดัชนีของฮับพร้อมรหัสที่ให้ไว้ - person Shawn Kendrot; 27.01.2015
comment
น่าเสียดายที่มันทำงานแตกต่างออกไปเมื่อฉันเรียกใช้ หากมีเหตุการณ์ ScrollerOnViewChanged มากกว่าสองส่วนเกิดขึ้นหลายครั้งตามที่คุณแนะนำและท้ายที่สุดดัชนีก็ถูกต้อง ถ้าฉันลบส่วนต่างๆ และเหลือเพียงส่วนที่หนึ่งและส่วนที่สอง กิจกรรมจะเกิดขึ้นหลายครั้งอีกครั้ง แต่ดัชนีเวลานี้จะเป็นศูนย์เสมอ ในขณะที่เรากำลังตรวจสอบคุณสมบัติ hub.SectionsInView[0] และส่วนที่อยู่ในมุมมองไม่เปลี่ยนแปลง มันเป็นพฤติกรรมปกติใช่ไหม - person Birkan Cilingir; 29.01.2015

หลังจากอ่าน บทความของ Shawn แนะนำโดย @Depechie ฉันพยายามใช้โซลูชันเดียวกันนี้ในแอปของฉันเพื่ออัปเดตเนื้อหาของ AppBar ด้วยปุ่มเฉพาะส่วน

แม้ว่าฉันจะพยายามแล้ว แต่ฉันก็ไม่สามารถทำงานได้ ดังนั้นฉันจึงปรับเปลี่ยนวิธีแก้ปัญหาบางส่วน ฉันใช้วิธีแก้ปัญหาพฤติกรรมและเปลี่ยนเฉพาะ ScrollerOnViewChangedfunction ดังนี้ นี่อาจไม่ใช่วิธีที่ดีที่สุดหรืออาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิดในสถานการณ์ต่างๆ แต่ในกรณีของฉันมันใช้งานได้โดยไม่มีปัญหา

    private void ScrollerOnViewChanged(object sender, ScrollViewerViewChangedEventArgs scrollViewerViewChangedEventArgs)
    {
        _settingIndex = true;
        ScrollViewer scrollViewer = sender as ScrollViewer;
        if (scrollViewer.HorizontalOffset > (scrollViewer.ViewportWidth / 2))
            SelectedIndex = 1;
        else
            SelectedIndex = 0;

        _settingIndex = false;
    }

หลังจากนั้นฉันได้เพิ่มคุณสมบัติใน viewmodel ของฉันเพื่อจัดเก็บดัชนีที่เลือก

    private int _selectedIndex;

    public int SelectedIndex
    {
        get { return _selectedIndex; }
        set
        {
            SetProperty(ref this._selectedIndex, value);
        }
    }

ฉันใช้ลักษณะการทำงานใน XAML เพื่ออัปเดต SelectedIndex ใน ViewModel ของฉัน

<Hub>
    <i:Interaction.Behaviors>
        <behaviors:HubSelectionBehavior SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" />
    </i:Interaction.Behaviors>

    <HubSection>...</HubSection>
    <HubSection>...</HubSection>
</Hub>

สิ่งสุดท้ายที่ต้องทำคือตั้งค่าการเปิดเผย AppBarButtons โดยใช้คุณสมบัตินี้ SectionIndexToVisibilityConverter เปรียบเทียบ SelectedIndex กับ ConverterParameter และส่งกลับ Visibility.Visible หากเท่ากัน

<CommandBar>
    <AppBarButton Label="Open" Icon="World" Command="{Binding OpenInBrowserCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=0}"/>

    <AppBarButton Label="Previous" Icon="Back" Command="{Binding PreviousAnswerCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=1}"/>
    <AppBarButton Label="Next" Icon="Forward" Command="{Binding NextAnswerCommand}" Visibility="{Binding SelectedIndex, Converter={StaticResource SectionIndexToVisibilityConverter}, ConverterParameter=1}"/>
</CommandBar>

ขอบคุณ @Depechie ที่แนะนำบทความและ @Shawn ที่เขียนบทความ :)

person Birkan Cilingir    schedule 05.02.2015