Mengubah orientasi kontrol pengguna (ProgressBar) di WP7?

Saya menggunakan bilah kemajuan di aplikasi saya, bilah kemajuan ini ditentukan di dalam kontrol pengguna, misalnya:

UserControl x:Class="StirLibrary.ProgressBarControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
mc:Ignorable="d"  d:DesignHeight="800" d:DesignWidth="480">

<Grid x:Name="LayoutRoot" Height="800">
    <Border BorderThickness="2" BorderBrush="Transparent" Background="Transparent" Margin="50,522,50,158">
        <StackPanel>
            <TextBlock Text="Loading..." Name="loading" Grid.Row="1" HorizontalAlignment="Center" Height="30" Foreground="Green">
            </TextBlock>
            <ProgressBar Background="Transparent" Margin="10, 0, 0, 10" Height="80" HorizontalAlignment="Center" Name="progressBar1" VerticalAlignment="Top" Width="380" Grid.Row="2" HorizontalContentAlignment="Left" IsHitTestVisible="True" VerticalContentAlignment="Top" Value="0" Maximum="100">
            </ProgressBar>
        </StackPanel>
    </Border>
</Grid>
</UserControl>

Masalah saya adalah ketika orientasi aplikasi saya berubah menjadi lanskap, orientasi bilah kemajuan tidak berubah dan ini membuat aplikasi terlihat jelek. Setiap saran bagaimana menghindari hal ini dan membuat bilah kemajuan ditampilkan sesuai orientasi dipersilakan.


person Apoorva    schedule 18.11.2011    source sumber
comment
Bagaimana Anda menampilkan kontrol pengguna? Jika ada dalam PopUp maka ini adalah masalah umum pada popup tersebut.   -  person Matt Lacey    schedule 18.11.2011
comment
Saya tahu ini tidak menjawab pertanyaan Anda, tapi mungkin Anda akan mempertimbangkan untuk menggunakan ProgressIndicator yang ditangani oleh OS dan merupakan standar untuk menampilkan kemajuan: msdn.microsoft.com/en-us/library/. Kalau tidak, saya juga akan mempertimbangkan untuk melihat PerformanceProgressBar dari Silverlight Toolkit yang seharusnya bekerja lebih baik dalam beberapa hal daripada ProgressBar yang sudah ada.   -  person Filip Skakun    schedule 18.11.2011
comment
@Matt Saya menampilkan kontrol pengguna dalam Popup.. dan masalah saya adalah seluruh solusi saya memiliki 3 bagian UI proyek, bagian Perpustakaan dan bagian penjadwal.. dan kontrol bilah kemajuan ini ada di bagian Perpustakaan dan saya tidak dapat mengaksesnya di saya Bagian UI tempat saya memanggil acara untuk orientasi diubah.. Saya tahu solusi parsial untuk masalah saya ..yaitu, panel tumpukan yang berisi bilah kemajuan harus diputar 90 derajat dan (render transform origin) harus ditentukan untuk panel tumpukan ketika orientasi berubah karena saya tidak dapat mengakses elemen panel tumpukan. Saya tidak dapat mengimplementasikan apa yang saya tahu..   -  person Apoorva    schedule 21.11.2011


Jawaban (3)


Seperti yang disebutkan Matt di atas, tidak mungkin mengorientasikan pop up di kontrol pengguna karena Kontrol pengguna tidak memiliki ruang untuk orientasi yang didukung. tetapi karena ini merupakan persyaratan yang sangat penting untuk Aplikasi kami, saya menemukan solusi dan membuat beberapa perubahan pada file kelas Halaman Utama dan file kelas kontrol pengguna.. perubahannya adalah:

 private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            if ((e.Orientation & PageOrientation.Portrait) == PageOrientation.Portrait)
            {
ProgressBarControl.getInstance().ProgressBarControl_LayoutUpdated(this, e,e.Orientation.ToString());
}
else if ((e.Orientation & PageOrientation.Landscape) == PageOrientation.Landscape)
            {
ProgressBarControl.getInstance().ProgressBarControl_LayoutUpdated(this, e, e.Orientation.ToString());
}
}

Ini adalah perubahan di MainPage.xaml.cs

public partial class ProgressBarControl : UserControl
{
    private static ProgressBarControl instance = null;
    public static Popup popup;

    private ProgressBarControl()
    {
        InitializeComponent();
    }
    public static ProgressBarControl getInstance()
    {
        if (instance == null)
        {
            instance = new ProgressBarControl();
            popup = new Popup();
            popup.Child = instance;
            popup.IsOpen = false;
        }
        return instance;
    }
    public void ProgressBarControl_LayoutUpdated(object sender, EventArgs e,string orientation)
    {
        if (orientation == "LandscapeRight")
        {
            ProgressPanel.RenderTransformOrigin = new Point(0.5, 0.5);
            ProgressPanel.RenderTransform = new CompositeTransform { Rotation = 270 };
        }
        else if(orientation == "LandscapeLeft")
        {
            ProgressPanel.RenderTransformOrigin = new Point(0.5, 0.5);
            ProgressPanel.RenderTransform = new CompositeTransform { Rotation = 90 };
        }
        else
        {
            ProgressPanel.RenderTransformOrigin = new Point(0, 0);
            ProgressPanel.RenderTransform = new CompositeTransform { Rotation = 0 };
        }

    }

    public static void displayProgressBar(int requestId, int status, string msg)
    {
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                if (instance == null)
                {
                    instance = new ProgressBarControl();
                    popup = new Popup();
                    popup.Child = instance;
                }
                popup.IsOpen = true;
                instance.loading.Text = msg;
                instance.progressBar1.IsIndeterminate = true;
                instance.progressBar1.Value = status;
            });
    }
    public static void dismissProgressBar()
    {
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                if(popup!=null)
                {
                    popup.IsOpen = false;
                }
            });
    }
}

dan ini yang telah saya lakukan di file ProgressBarControl.cs saya (ini adalah file kelas kontrol pengguna)

berkas Xaml:

<UserControl x:Class="StirLibrary.ProgressBarControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
mc:Ignorable="d"  d:DesignHeight="800" d:DesignWidth="480">

<Grid x:Name="LayoutRoot" Height="800">
    <!--<Border BorderThickness="2" BorderBrush="Black" Background="Transparent" Margin="54,406,50,320"></Border>-->
    <StackPanel x:Name="ProgressPanel" Background="Black" Margin="54,406,50,320">
        <TextBlock Text="Loading..." Name="loading" Grid.Row="1" HorizontalAlignment="Center" Height="32" Foreground="White"></TextBlock>
        <ProgressBar Background="Green" Margin="10, 0, 0, 10" Height="33" Foreground="White" HorizontalAlignment="Center" Name="progressBar1" VerticalAlignment="Top" Width="351" Grid.Row="2" HorizontalContentAlignment="Left" IsHitTestVisible="True" VerticalContentAlignment="Top" Value="0" Maximum="100"></ProgressBar>
    </StackPanel>
</Grid>
</UserControl>
person Apoorva    schedule 24.11.2011

Saya dapat mengaktifkan orientasi untuk UserControl popup saya hanya dengan menambahkan Anak-anak dari layar utama di mana Popup ditampilkan sebagai:

popUp = new Popup();
loginControl = new LoginPopup();  // this is the custom UserControl

popUp.Child = loginControl;
LayoutRoot.Children.Add(popUp);
person Jalpa    schedule 08.05.2012