Problem 1.
You should take in account the value of e.Delta
.
Not
var zoom = e.Delta > 0 ? 0.2 : -0.2;
but
var zoom = e.Delta * k;
k
is a double
factor, it's device specific
The effective upper and lower ranges of this value potentially come from device implementations or other callers that raised the event, and are therefore not defined
But its value get higher for as you say one big scroll.
One possible solution to find k
would be to get first MouseWheel
event and use received value as a starting point. If you receive double of that value, then two or more of mousewheel scrolls were combined into single event. Or do calibration all time, remembering smallest value and changing factor for it. Up to you.
Problem 2.
Use multiplication instead of adding flat value.
And combined solution will looks like this
st.ScaleX *= e.Delta * k;