在顶部定义的变量:
int alpha = 0;
bool backButtonClick = false;
bool breakCheck = false;
Button的逻辑片段:
private void storyChooser_Click(object sender, EventArgs e)
{
switch (userChoice)
{
case Choice.Son:
transitions();
if (alpha == 0)
{
pictureBox1.Image = Properties.Resources.test;
timer1.Start();
}
break;
}
计时器:
private void timer1_Tick(object sender, EventArgs e)
{
if (backButtonClick == true)
{
timer1.Stop();
alpha = 0;
backButtonClick = false;
}
if (alpha++ < 40)
{
Image image = pictureBox1.Image;
using (Graphics g = Graphics.FromImage(image))
{
Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width);
g.DrawRectangle(pen, -1, -1, image.Width, image.Height);
g.Save();
}
pictureBox1.Image = image;
}
else
{
timer1.Stop();
}
if (alpha == 40 && breakCheck == false)
{
pictureBox1.Image = Properties.Resources.transitionTest;
timer1.Start();
while (alpha-- > 0)
{
Image image = pictureBox1.Image;
using (Graphics g = Graphics.FromImage(image))
{
Pen pen = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width);
g.DrawRectangle(pen, -1, -1, image.Width, image.Height);
g.Save();
}
pictureBox1.Image = image;
label1.Text = alpha.ToString();
}
breakCheck = true;
}
label1.Text = alpha.ToString();
}
我正在通过while循环,朝着计时器的底部运行,而不更新任何图形。
感谢。
答案 0 :(得分:1)
我认为这可能是因为你在while循环中都是这样做的,ui在你改变它之前没有机会重新绘制它。
您可能也希望在计时器滴答中执行减法部分,而不是一次性。
答案 1 :(得分:1)
看起来你的第二个 fadein 条件中有一个while循环。
这将使你的控制在下一次计时器滴答事件之前从一侧转到另一侧。
我不得不重新编写代码,以便我能更好地感受它。
如果您使用PictureBox
直接写入屏幕,为什么使用Graphic
控件?
这是我的代码可怕的错误。我希望它不会冒犯。
我事先声明了所有变量,所以VS不会抱怨错误的定义。
我也没有transitionTest
图片,因此我为此定义了Properties_Resources_transitionTest
。
int MAX = 40;
int alpha;
bool backButtonClick;
bool breakCheck;
Label label1;
Image Properties_Resources_transitionTest;
Image image;
在下面初始化的内容并将其踢掉。我不知道你的枚举类型意味着什么,或者transition()
方法是你所谓的。
private void storyChooser_Click(object sender, EventArgs e) {
alpha = 0;
backButtonClick = false;
breakCheck = false;
image = Properties_Resources_transitionTest;
timer1.Start();
}
对于backButtonClick
和breakCheck
值,我将它们放在表单的click事件处理程序中,如下所示:
private void backButton_Click(object sender, EventArgs e) {
backButtonClick = !backButtonClick;
}
private void break_Click(object sender, EventArgs e) {
breakCheck = true;
// easier to just write
// timer1.Stop();
}
此Timer Tick事件处理程序应该处理您要执行的操作。请注意,while
循环也已被删除。
private void timer1_Tick(object sender, EventArgs e) {
if (!breakCheck) {
using (Pen p = new Pen(Color.FromArgb(alpha, 255, 255, 255), image.Width)) {
using (Graphics g = Graphics.FromImage(image)) {
g.DrawRectangle(p, 0, 0, image.Width, image.Height);
}
}
if (backButtonClick) {
alpha--;
if (alpha == 0) {
timer1.Stop();
}
} else {
alpha++;
if (alpha == MAX) {
timer1.Stop();
}
}
} else {
timer1.Stop();
}
label1.Text = alpha.ToString();
}
更新:评论中的每个问题:
如果backButtonClick
为真,则alpha
值会在每次计时器滴答时减少1,并在alpha
变为零时停止。
如果backButtonClick
为false,则alpha
会增加,直到达到MAX
,然后停止计时器。
由于alpha
控制了Pen
颜色的不透明度,因此您的图片会显示淡入淡出,具体取决于backButtonClick
设置的值。
我相信这就是你所追求的,但我可能是错的。
答案 2 :(得分:0)
我假设你的意思是它跳过了以下部分:
if (alpha == 40 && breakCheck == false)
我认为这不会执行,因为你因为这一行而停止增加值为39的alpha:
if (alpha++ < 40)
如果将其更改为不太相等,则应执行:
if (alpha++ <= 40)
答案 3 :(得分:-1)
为什么人们在winforms中坚持这么多?
看,你可以在WPF中使用20行XAML并且绝对没有C#代码:
<Window x:Class="WpfApplication4.Window4"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window4" Height="300" Width="300">
<Window.Resources>
<Storyboard x:Key="FadeIn" TargetName="Red" Duration="00:00:05">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1"/>
</Storyboard>
<Storyboard x:Key="FadeOut" TargetName="Blue" Duration="00:00:05">
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0"/>
</Storyboard>
</Window.Resources>
<DockPanel>
<Button DockPanel.Dock="Top" HorizontalAlignment="Center" Content="Fade">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard Storyboard="{StaticResource FadeIn}"/>
<BeginStoryboard Storyboard="{StaticResource FadeOut}"/>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>
<Grid Margin="30">
<Grid Background="Red" Opacity="0" x:Name="Red"/>
<Grid Background="Blue" x:Name="Blue"/>
</Grid>
</DockPanel>
</Window>
代码背后:
using System.Windows;
namespace WpfApplication4
{
public partial class Window4 : Window
{
public Window4()
{
InitializeComponent();
}
}
}
只需将我的代码复制并粘贴到文件中即可 - >新项目 - &gt; WPF应用程序并亲自查看结果。
这些是具有纯色背景的网格。您可以用<Grid/>
或任何您想要的内容替换<Image/>
。