我有下面这个简单的程序,可以在两个不同的页面之间来回切换框架的上下文。第一个页面只是一张图片,加载正常,但第二个页面是一个帧,它的源被设置为实时天气雷达。http://www.wunderground.com/auto/wxmap/IN/Carmel.html。当计时器将帧的上下文切换到天气雷达页面时,它才开始加载,并在最初的3-4秒内加载页面。我在创建页面并将其分配给_nextslide之后立即检查了frame的.Navigated事件,那么为什么我的frame要等到页面显示出来才能呈现网站呢?这将是完美的,如果我可以显示该网站完全加载。
XAML:
<Page>
<Viewbox Stretch="Fill" Margin="15">
<Frame Height="800" Width="1280" Content="{Binding SlideFrame}"/>
</Viewbox>
</Page>C#:
private Page _slideFrame;
private Page _nextFrame;
private DispatcherTimer _slideChangeTimer;
private int currentSlide = 1;
// Property
public Page SlideFrame
{
get { return _slideFrame; }
set
{
_slideFrame = value;
NotifyPropertyChanged("SlideFrame");
}
}
// ViewModel Constructor
public Page1ViewModel()
{
this.SlideFrame = new Slide1();
_nextFrame = new Slide2();
_slideChangeTimer = new DispatcherTimer();
_slideChangeTimer.Interval = TimeSpan.FromSeconds(8);
_slideChangeTimer.Tick += new EventHandler(SlideChange_Tick);
_slideChangeTimer.Start();
}
// 8 second timer event handler
private void SlideChange_Tick(object sender, EventArgs e)
{
if (currentSlide == 1)
{
this.SlideFrame = _nextFrame;
_nextFrame = new Slide1(false);
currentSlide = 2;
}
else
{
this.SlideFrame = _nextFrame;
_nextFrame = new Slide2();
currentSlide = 1;
}
}发布于 2012-08-25 03:42:59
不使用框架或网页,但它展示了如何在后台获取数据,以避免在计时器中阻塞UI。如果最后一个网页还没有被获取,你应该添加等待的逻辑。
<Button Grid.Row="0" Content="AmIhot" Click="onClick" Width="60" HorizontalAlignment="Left"/>
<TextBlock Grid.Row="1" x:Name="hotText" />
<TextBlock Grid.Row="2" x:Name="revolvingText" Text="{Binding Path=RevolvingText, Mode=OneWay}" />
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
namespace waste09
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private System.Windows.Threading.DispatcherTimer _slideChangeTimer;
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
RevolvingText = "Starting text";
_slideChangeTimer = new System.Windows.Threading.DispatcherTimer();
_slideChangeTimer.Interval = TimeSpan.FromSeconds(8);
_slideChangeTimer.Tick += new EventHandler(SlideChange_Tick);
_slideChangeTimer.Start();
}
// 8 second timer event handler
private void SlideChange_Tick(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
// this will NOT block the UI
Thread.Sleep(4000); // simulate a long fetch
RevolvingText = "Fetched text " + Guid.NewGuid();
NotifyPropertyChanged("RevolvingText");
});
RevolvingText = "Fetching data and UI not blocked ";
NotifyPropertyChanged("RevolvingText");
}
public string RevolvingText { get; private set; }
private void onClick(object sender, RoutedEventArgs e)
{
hotText.Text = "Yes you are hot " + Guid.NewGuid();
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
}
}https://stackoverflow.com/questions/12114919
复制相似问题